无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net
ZOJ1015
题意简述:给定一个无向图,判断是否存在一个长度大于3的环路,且其上没有弦(连接环上不同两点的边且不在环上)。
命题等价于该图是否存在完美消除序列。
所谓完美消除序列:在 vi,vi+1,...vn vi与之后与vi相邻的点构成一个团(完全子图)。
求完美消除序列的MCS算法。倒序给点标号,标号为i的点出现在序列的第i项。对每个顶点i,维护标号label[i],表示标号的度,每次选择标号最大的点标号。用堆加速。
求出了完美消除序列后,只要判断这个序列是否合法就可以得出结论。
在 vi,vi+1,...vn的导出子图中找到与vi相邻的标号最小(度最小)的点,设为vj,再检查vj是否与每个vi的邻接点相邻。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
#include<set>
#define clr(x,y) memset(x,y,sizeof(x))
using namespace std;
const int maxn=1010;vector<int> construct(int n,vector<int> adj[maxn])
{static int rank[maxn],label[maxn];clr(rank,-1);clr(label,0);priority_queue<pair<int,int> > heap;for(int i=1;i<=n;i++)heap.push(make_pair(0,i));for(int i=n-1;i>=0;i--){while(true){int u=heap.top().second;heap.pop();if(rank[u]==-1){rank[u]=i;for(vector<int>:: iterator iter=adj[u].begin();iter!=adj[u].end();++iter){if(rank[*iter]==-1){label[*iter]++;heap.push(make_pair(label[*iter],*iter));}}break;}}}vector<int> result(n);for(int i=1;i<=n;i++) {result[rank[i]]=i;} return result;
}bool check(int n,vector<int>adj[maxn],vector<int> ord)
{static bool mark[maxn];static int rank[maxn];for(int i=0;i<n;i++)rank[ord[i]]=i;clr(mark,0);for(int i=0;i<n;i++){vector<pair<int,int> >tmp;for(vector<int>::iterator iter=adj[ord[i]].begin();iter!=adj[ord[i]].end();++iter)if(!mark[*iter])tmp.push_back(make_pair(rank[*iter],*iter));sort(tmp.begin(),tmp.end());if(tmp.size()){int u=tmp[0].second;set<int> tmpAdj;for(vector<int>::iterator iter=adj[u].begin();iter!=adj[u].end();++iter){tmpAdj.insert(*iter);}for(int i=1;i<(int)tmp.size();++i){if(!tmpAdj.count(tmp[i].second))return false;}}mark[ord[i]]=true;
}
return true;
}bool is_chordal(int nodeCount,vector<pair<int,int> >edges)
{int n=nodeCount;vector<int>adj[maxn];for(int i=0;i<=n;i++)adj[i].clear();for(vector<pair<int,int> >::iterator iter=edges.begin();iter!=edges.end();++iter){adj[iter->first].push_back(iter->second);adj[iter->second].push_back(iter->first);} return check(n,adj,construct(n,adj));
}int main()
{int n,m;while(scanf("%d%d",&n,&m)){if(n==0&&m==0)return 0;vector<pair<int,int> >ed;for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);ed.push_back(make_pair(a,b));}if(is_chordal(n,ed))printf("Perfect\n\n");else printf("Imperfect\n\n");}return 0;
}
完美消除序列还有广泛的应用,以后来补充。
转载于:https://www.cnblogs.com/heisenberg-/p/6444707.html
无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net相关推荐
- 弦图与完美消除序列(bzoj 1006: [HNOI2008]神奇的国度)
诱导子图:子图中任意一条边的两个端点一定也都在这个子图中 最大团:团中任意两点之间一定都有边,而包含顶点最多的团就是最大团 最小团覆盖:用最少的团覆盖图中所有的点 最大独立集:独立集中任意两点之间一定 ...
- bzoj 1242 Zju1015 Fishing Net 弦图判定
1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec Memory Limit: 162 MB [Submit][Status][Discuss] Des ...
- 概率图模型-可分解图-连接树算法-弦图-图论
概率图模型–精确推断算法的原理 本文主要内容 本文从可分解图出发,逐渐引入弦图,三角化图,然后揭示了为什么引入可分解图,因为可分解图是在连接树算法中最终得到的,还讲解了为什么要使用连接树算法,因为连接 ...
- 图论 —— 弦图 —— MCS 算法
[概述] MCS 算法是最大势算法(Maximum Cardinality Search),其常用于弦图的判定.求弦图的最大团.最小着色.最大独立集.最小团覆盖等. 一个无向图的弦图当且仅当其有一个完 ...
- 图论:弦图最小点染色
弦图的定义:当图中任意长度大于3的环都至少有一个弦时, 一个无向图称为弦图 不存在四角.五角等关系就说明这个图是一个弦图 题目问的是,任何一对相互认识的人不可以组一队,问最多可以组多少对 所有的人构成 ...
- 图论:关于弦图的几个图论结论
定义 弦:连接环中不相邻的两个点的边 一个图是弦图当图中任意长度大于3的环都至少有一个弦. α(G):\alpha(G):α(G):图GGG中最大独立集的大小,称为最大独立集数 κ(G):\kappa ...
- 图论 —— 弦图 —— LexBFS 算法
[概述] LexBFS 是字典序广度优先搜索(Lexicographic BFS),其常用于弦图的判定. 每次按从 n 到 1 的顺序依次给点编号,每个点维护一个 list,用于记录与其相邻的已标号点 ...
- BZOJ 1006 神奇的国度(弦图的染色数)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1006 题意:给定一个弦图,求最小染色数.就是用最小数目的颜色进行染色使得任意两个相邻的节 ...
- r语言mfrow全程_R语言弦图绘制全解析——基础篇
弦图(Chord diagram),是使用圆形坐标系体现多组数据间关系强弱的可视化形式.本文将介绍使用R语言的circlize包绘制弦图的方法,代码来源于circlize官方文档,http://zug ...
最新文章
- 怎样查找this的指向
- Android源代码下载与编译 - 2019
- GARFIELD@09-28-2004
- 几种类加载器的使用体会
- 打开php.ini中的Safe_mode,会影响哪些函数?
- 高等数学下-赵立军-北京大学出版社-题解-练习10.4
- nyoj116士兵杀死(两)段树单点更新
- 展开和收起动画(jQuery)
- C++的类型转换操作符
- 测试网速_Azure AWS Google Cloud服务网速及Ping值延时在线测试
- 邮件发送平台哪个好?大家究竟该如何选择?
- 【干货】python爬取《战狼2》电影短评论,生成图云
- python symbols函数_Python的武器库07:sympy模块
- 【数理知识】kronecker 克罗内克积
- MackDown MAC版添加本地图片
- 基于OpenAPI Specification自动生成Android客户端代码
- 使用OBS录屏有很大的电流回声
- 如何看待人工智能的复杂性对于行业应用的影响
- 小学生计算机房的简笔画,小学生美丽的校园简笔画图片欣赏
- SVN历史版本比较报错:Bad URL passed to RA layer
热门文章
- nacos集群之日志狂刷fail to connect server,after trying 567 times,last try server is...
- CentOS7安装VMware Tools
- StringBuilder 为什么线程不安全?
- 面试「计算机操作系统」知识点大集合!
- Web 安全漏洞之 XSS 攻击,Java 开发必看!
- TensorFlow全新的数据读取方式:Dataset API入门教程
- 【Scratch】青少年蓝桥杯_每日一题_4.01_踢足球
- spring 学习—spring的相关概念(01)
- 四核处理器_(技术文档)你知道AMD Ryzen处理器中的CCX与CCD是什么吗?
- 干粉灭火器的维护保养