无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net
题意简述:给定一个无向图,判断是否存在一个长度大于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;
}
完美消除序列还有广泛的应用,以后来补充。
无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net的更多相关文章
- ZOJ 1015 Fishing Net(判断弦图)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=15 题意:给定一个图.判断是不是弦图? 思路:(1)神马是弦图?对于一 ...
- BZOJ 1006 完美消除序列&最大势算法&弦图
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...
- bzoj 1006: [HNOI2008]神奇的国度 弦图的染色问题&&弦图的完美消除序列
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1788 Solved: 775[Submit][Stat ...
- bzoj 1006 [HNOI2008]神奇的国度 弦图+完美消除序列+最大势算法
[HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4370 Solved: 2041[Submit][Status][D ...
- 【BZOJ】1006: [HNOI2008]神奇的国度 弦图消除完美序列问题
1006: [HNOI2008]神奇的国度 Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则. 他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的 ...
- ZOJ 1015 Fishing Net(弦图判定)
In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...
- ●BZOJ 1006 [HNOI2008]神奇的国度(弦图最小染色数)○ZOJ 1015 Fishing Net
●赘述题目 给出一张弦图,求其最小染色数. ●题解 网上的唯一“文献”:<弦图与区间图>(cdq),可以学习学习.(有的看不懂) 摘录几个解决改题所需的知识点: ●子图和诱导子图(一定要弄 ...
- [bzoj1242] Zju1015 Fishing Net弦图判定
弦图判定..MCS算法. 先选一个点,然后每次拿 相邻已选点最多 的未选点. 选完之后判断一下是否是完美消除序列. #include<cstdio> #include<iostrea ...
- BZOJ 1006: [HNOI2008]神奇的国度(弦图)
传送门 解题思路 弦图就是图中任意一个大小\(>=4\)的环至少存在一条两个节点不相邻的边,这样的图称为弦图,弦图有许多优美的性质.一个无向图是弦图当且仅当它有一个完美消除序列,完美消除序列就是 ...
随机推荐
- BZOJ2318: Spoj4060 game with probability Problem
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #i ...
- hibernate-Maven
1.创建Maven 2.创建Maven工程 3.然后一直下一步 4.创建成功后Maven 5.下载jra包 //hibernate <dependencies> <dependenc ...
- Dev的关于XtraGrid的使用2
接着说,GirdControl如何定位和查找指定列显示值的行(注意是列的实显示值,而不是关联数据源列值) 下面请看代码: using DevExpress.XtraGrid.Views.Base; u ...
- C-Sharp网络编程案例解析(Socket类的使用)
Server端: using System; using System.Collections.Generic; using System.Text; using System.Net; using ...
- XML文档的PHP程序查询代码
PHP文档: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www ...
- DELPHI删除记录文件
http://blog.itpub.net/729024/viewspace-564890/ DBGrid1.SelectedRows.Delete;
- catalan卡特兰数
卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜密率捷法>最 ...
- HTML <div> 和<span>
HTML <div> 和<span> HTML 可以通过 <div> 和 <span>将元素组合起来. HTML 区块元素 大多数 HTML 元素被定义 ...
- 在Java中打开浏览器
try { Runtime.getRuntime().exec( "explorer http://www.baidu.com"); java.net.URI uri = new ...
- Oracle job调用存储过程
在PL/SQL中的what值中直接写入存储过程的名称+“分号”: begin sys.dbms_job.submit(job => :job, what => 'del_ky_items; ...