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相关推荐

  1. 弦图与完美消除序列(bzoj 1006: [HNOI2008]神奇的国度)

    诱导子图:子图中任意一条边的两个端点一定也都在这个子图中 最大团:团中任意两点之间一定都有边,而包含顶点最多的团就是最大团 最小团覆盖:用最少的团覆盖图中所有的点 最大独立集:独立集中任意两点之间一定 ...

  2. bzoj 1242 Zju1015 Fishing Net 弦图判定

    1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec  Memory Limit: 162 MB [Submit][Status][Discuss] Des ...

  3. 概率图模型-可分解图-连接树算法-弦图-图论

    概率图模型–精确推断算法的原理 本文主要内容 本文从可分解图出发,逐渐引入弦图,三角化图,然后揭示了为什么引入可分解图,因为可分解图是在连接树算法中最终得到的,还讲解了为什么要使用连接树算法,因为连接 ...

  4. 图论 —— 弦图 —— MCS 算法

    [概述] MCS 算法是最大势算法(Maximum Cardinality Search),其常用于弦图的判定.求弦图的最大团.最小着色.最大独立集.最小团覆盖等. 一个无向图的弦图当且仅当其有一个完 ...

  5. 图论:弦图最小点染色

    弦图的定义:当图中任意长度大于3的环都至少有一个弦时, 一个无向图称为弦图 不存在四角.五角等关系就说明这个图是一个弦图 题目问的是,任何一对相互认识的人不可以组一队,问最多可以组多少对 所有的人构成 ...

  6. 图论:关于弦图的几个图论结论

    定义 弦:连接环中不相邻的两个点的边 一个图是弦图当图中任意长度大于3的环都至少有一个弦. α(G):\alpha(G):α(G):图GGG中最大独立集的大小,称为最大独立集数 κ(G):\kappa ...

  7. 图论 —— 弦图 —— LexBFS 算法

    [概述] LexBFS 是字典序广度优先搜索(Lexicographic BFS),其常用于弦图的判定. 每次按从 n 到 1 的顺序依次给点编号,每个点维护一个 list,用于记录与其相邻的已标号点 ...

  8. BZOJ 1006 神奇的国度(弦图的染色数)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1006 题意:给定一个弦图,求最小染色数.就是用最小数目的颜色进行染色使得任意两个相邻的节 ...

  9. r语言mfrow全程_R语言弦图绘制全解析——基础篇

    弦图(Chord diagram),是使用圆形坐标系体现多组数据间关系强弱的可视化形式.本文将介绍使用R语言的circlize包绘制弦图的方法,代码来源于circlize官方文档,http://zug ...

最新文章

  1. 怎样查找this的指向
  2. Android源代码下载与编译 - 2019
  3. GARFIELD@09-28-2004
  4. 几种类加载器的使用体会
  5. 打开php.ini中的Safe_mode,会影响哪些函数?
  6. 高等数学下-赵立军-北京大学出版社-题解-练习10.4
  7. nyoj116士兵杀死(两)段树单点更新
  8. 展开和收起动画(jQuery)
  9. C++的类型转换操作符
  10. 测试网速_Azure AWS Google Cloud服务网速及Ping值延时在线测试
  11. 邮件发送平台哪个好?大家究竟该如何选择?
  12. 【干货】python爬取《战狼2》电影短评论,生成图云
  13. python symbols函数_Python的武器库07:sympy模块
  14. 【数理知识】kronecker 克罗内克积
  15. MackDown MAC版添加本地图片
  16. 基于OpenAPI Specification自动生成Android客户端代码
  17. 使用OBS录屏有很大的电流回声
  18. 如何看待人工智能的复杂性对于行业应用的影响
  19. 小学生计算机房的简笔画,小学生美丽的校园简笔画图片欣赏
  20. SVN历史版本比较报错:Bad URL passed to RA layer

热门文章

  1. nacos集群之日志狂刷fail to connect server,after trying 567 times,last try server is...
  2. CentOS7安装VMware Tools
  3. StringBuilder 为什么线程不安全?
  4. 面试「计算机操作系统」知识点大集合!
  5. Web 安全漏洞之 XSS 攻击,Java 开发必看!
  6. TensorFlow全新的数据读取方式:Dataset API入门教程
  7. 【Scratch】青少年蓝桥杯_每日一题_4.01_踢足球
  8. spring 学习—spring的相关概念(01)
  9. 四核处理器_(技术文档)你知道AMD Ryzen处理器中的CCX与CCD是什么吗?
  10. 干粉灭火器的维护保养