无向图的完美消除序列 判断弦图 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\)的环至少存在一条两个节点不相邻的边,这样的图称为弦图,弦图有许多优美的性质.一个无向图是弦图当且仅当它有一个完美消除序列,完美消除序列就是 ...
随机推荐
- 普通项目如何转换成Maven项目 --转载自百度知道
右键普通Java项目,在弹出的菜单中选择[Configure]-[Convert to Maven Project]: 2 在弹出的对话框中输入项目的groupId, artifactId和versi ...
- Android Studio文件目录介绍
一.安装的时候并不理解很多东西的用处,只是根据教程来做,所以想整理一下思路: android sdk里的各目录作用: 1.AVD Manager.exe:虚拟机管理工具,用于建立和管理虚拟机. 2.S ...
- 笔记整理--socket_server
epoll精髓 - 彭帅 - 博客园 - Google Chrome (2013/10/11 20:47:52) epoll精髓 在linux的网络编程中,很长的时间都在使用select来做事件触发. ...
- Ajax Not Found,asp.net mvc 中
x前台代码: <script type="text/javascript"> $(document).ready(function () { $("#btnS ...
- WebSocket协议再认识
WebSocket出现之前 在线聊天室.在线客服系统.评论系统.WebIM等这些应用有一个共同点,就是用户不需要去刷新浏览器就能够从服务器获得最新的数据,这就用到了推送技术. WebSocket出现之 ...
- Codeforces758C
C. Unfair Poll time limit per test:1 second memory limit per test:256 megabytes input:standard input ...
- canvas小程序-快跑程序员
canvas不用说html5带来的好东西,游戏什么的,么么哒 记得有一天玩手机游戏,就是一个跳跃过柱子那种,其实元素很简单啊,app能开发,借助html5 canvas也可以啊, 于是就开始了. -- ...
- twemproxyRedis协议解析探索——剖析twemproxy代码正编
这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...
- [Bullet3]创建世界(场景)及常见函数
创建世界(场景)及常见函数 官方文档:http://bulletphysics.org 开源代码:https://github.com/bulletphysics/bullet3/releases A ...
- Scrollview回弹效果自定义控件
滚动回弹效果分析: 首先,创建一个类,继承scrollview,重写ontouch事件,实现伸缩回弹效果. [scroollview节点下只能有一个子节点,这个子节点就是我们要移动的view布局] ...