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. 【转】安卓布局:layout_weight的理解

    android:layout_weight详细分析介绍: 布局文件是:<?xml version="1.0" encoding="utf-8"?>& ...

  2. 再次写了第一个servlet

    费时2小时,熟悉tomcat和编写了第一个servlet

  3. Android动画之translate(位移动画)(转)

    转自:http://www.cnblogs.com/bavariama/archive/2013/01/29/2881225.html 上一篇文章讲了 Android的左右滑动切换,实现过程是非常简单 ...

  4. JS如何获取页面可见区域高度

    window.document.body.clientHeight就可以 window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeig ...

  5. 【BZOJ1552】[Cerc2007]robotic sort Splay

    [BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...

  6. jQuery 在Table中选择input之类的东西注意事项

    jQuery 在Table中选择input之类的东西注意事项: 如果不在td标签中,是不能进行正确选择的: <table id="tblFormId"> <tr& ...

  7. ubuntu下mysql二进制包安装

    1.下载对应二进制包 cd /usr/local/srcsudo wget http://dev.mysql.com/downloads/file/?id=465030 2.解压并放在/usr/loc ...

  8. UWP开发技巧:实现SMB协议操作文件服务器文件

    问题来源 文件服务器文件夹操作在PC与Surface端确实还是和传统操作一样没什么区别,但是到了手机端与Surface Hub就没那么方便了,因为文件资源管理器Explorer根本没法添加网路硬盘.对 ...

  9. Leaflet+heatmap实现离线地图加载和热力图应用

    本人博客主页:http://www.cnblogs.com/webbest/ 2017年春节已经过完,新一年的奋斗也刚刚开始.今年要经历的挑战也是大大的...不扯了. 年底前软件项目相对较多,恰巧在年 ...

  10. 使用python制作ArcGIS插件(6)案例分析

    利用ArcPy制作航空制图插件 By 李远祥 这是笔者两年多前写的一个面向航路图做的一个插件,基本上将航路图的制作进行流程化,制作成为可交互的插件,只要有航路和机场的信息,就可以直接生成一个航路图,每 ...