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;
}

  完美消除序列还有广泛的应用,以后来补充。

无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net的更多相关文章

  1. ZOJ 1015 Fishing Net(判断弦图)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=15 题意:给定一个图.判断是不是弦图? 思路:(1)神马是弦图?对于一 ...

  2. BZOJ 1006 完美消除序列&最大势算法&弦图

    K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...

  3. bzoj 1006: [HNOI2008]神奇的国度 弦图的染色问题&&弦图的完美消除序列

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1788  Solved: 775[Submit][Stat ...

  4. bzoj 1006 [HNOI2008]神奇的国度 弦图+完美消除序列+最大势算法

    [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4370  Solved: 2041[Submit][Status][D ...

  5. 【BZOJ】1006: [HNOI2008]神奇的国度 弦图消除完美序列问题

    1006: [HNOI2008]神奇的国度 Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则. 他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的 ...

  6. ZOJ 1015 Fishing Net(弦图判定)

    In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...

  7. ●BZOJ 1006 [HNOI2008]神奇的国度(弦图最小染色数)○ZOJ 1015 Fishing Net

    ●赘述题目 给出一张弦图,求其最小染色数. ●题解 网上的唯一“文献”:<弦图与区间图>(cdq),可以学习学习.(有的看不懂) 摘录几个解决改题所需的知识点: ●子图和诱导子图(一定要弄 ...

  8. [bzoj1242] Zju1015 Fishing Net弦图判定

    弦图判定..MCS算法. 先选一个点,然后每次拿 相邻已选点最多 的未选点. 选完之后判断一下是否是完美消除序列. #include<cstdio> #include<iostrea ...

  9. BZOJ 1006: [HNOI2008]神奇的国度(弦图)

    传送门 解题思路 弦图就是图中任意一个大小\(>=4\)的环至少存在一条两个节点不相邻的边,这样的图称为弦图,弦图有许多优美的性质.一个无向图是弦图当且仅当它有一个完美消除序列,完美消除序列就是 ...

随机推荐

  1. 普通项目如何转换成Maven项目 --转载自百度知道

    右键普通Java项目,在弹出的菜单中选择[Configure]-[Convert to Maven Project]: 2 在弹出的对话框中输入项目的groupId, artifactId和versi ...

  2. Android Studio文件目录介绍

    一.安装的时候并不理解很多东西的用处,只是根据教程来做,所以想整理一下思路: android sdk里的各目录作用: 1.AVD Manager.exe:虚拟机管理工具,用于建立和管理虚拟机. 2.S ...

  3. 笔记整理--socket_server

    epoll精髓 - 彭帅 - 博客园 - Google Chrome (2013/10/11 20:47:52) epoll精髓 在linux的网络编程中,很长的时间都在使用select来做事件触发. ...

  4. Ajax Not Found,asp.net mvc 中

    x前台代码: <script type="text/javascript"> $(document).ready(function () { $("#btnS ...

  5. WebSocket协议再认识

    WebSocket出现之前 在线聊天室.在线客服系统.评论系统.WebIM等这些应用有一个共同点,就是用户不需要去刷新浏览器就能够从服务器获得最新的数据,这就用到了推送技术. WebSocket出现之 ...

  6. Codeforces758C

    C. Unfair Poll time limit per test:1 second memory limit per test:256 megabytes input:standard input ...

  7. canvas小程序-快跑程序员

    canvas不用说html5带来的好东西,游戏什么的,么么哒 记得有一天玩手机游戏,就是一个跳跃过柱子那种,其实元素很简单啊,app能开发,借助html5 canvas也可以啊, 于是就开始了. -- ...

  8. twemproxyRedis协议解析探索——剖析twemproxy代码正编

    这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...

  9. [Bullet3]创建世界(场景)及常见函数

    创建世界(场景)及常见函数 官方文档:http://bulletphysics.org 开源代码:https://github.com/bulletphysics/bullet3/releases A ...

  10. Scrollview回弹效果自定义控件

    滚动回弹效果分析: 首先,创建一个类,继承scrollview,重写ontouch事件,实现伸缩回弹效果. [scroollview节点下只能有一个子节点,这个子节点就是我们要移动的view布局]   ...