ZOJ 1015 弦图判定

一些定义:

弦图是一种特殊图:它的所有极小环都只有3个顶点。

单纯点:该顶点与其邻接点在原图中的导出子图是一个完全图。

图G的完美消去序列:一个顶点序列a1a2a3...an,使得对于每个元素ai,ai在ai、ai+1、ai+2...an的导出子图中是一个单纯点。

弦图有一个性质:任何一个弦图都至少存在一个单纯点(该点和其邻接点组成一个完全图)

弦图另一个性质:一个图是弦图当且仅当其存在完美消去序列。(归纳证明)

最大势算法(msc):若原图是弦图,则该算法计算出的序列是完美消去序列。

算法大致思想:从后往前计算序列,每次选择点v作为序列中的元素,v是还未选的点中与已经选了的点连边最多的点。

然后检查该序列是否是完美消去序列。

请看陈丹琦的ppt:《弦图与区间图》

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <vector>
 5 #define maxn 1010
 6 using namespace std;
 7
 8 int n, m;
 9 vector<int> g[maxn];
10 bool connect[maxn][maxn];
11
12 int id[maxn];
13 int label[maxn];
14 int seq[maxn];
15
16 struct Stat {
17     int lab, u;
18     Stat( int lab, int u ) : lab(lab), u(u) {}
19     bool operator<( const Stat & b ) const {
20         return lab<b.lab;
21     }
22 };
23 void mcs() {
24     priority_queue<Stat> pq;
25     memset( label, 0, sizeof(label) );
26     memset( id, 0, sizeof(id) );
27     for( int u=1; u<=n; u++ ) pq.push(Stat(0,u));
28
29     for( int i=n; i>=1; i-- ) {
30         while( id[pq.top().u] ) pq.pop();
31         int u = pq.top().u;
32         pq.pop();
33         id[u] = i;
34         for( int t=0; t<g[u].size(); t++ ) {
35             int v = g[u][t];
36             if( !id[v] ) {
37                 label[v]++;
38                 pq.push( Stat(label[v],v) );
39             }
40         }
41     }
42     for( int u=1; u<=n; u++ )
43         seq[id[u]] = u;
44 }
45
46 bool check() {
47     vector<int> c;
48     for( int i=1; i<=n; i++ ) {
49         int u = seq[i];
50         c.clear();
51         for( int t=0; t<g[u].size(); t++ ) {
52             int v = g[u][t];
53             if( id[v]>id[u] )
54                 c.push_back(v);
55         }
56         if( c.empty() ) continue;
57         int sc = c[0];
58         for( int t=1; t<c.size(); t++ )
59             if( id[c[t]]<id[sc] ) sc=c[t];
60         for( int t=0; t<c.size(); t++ ) {
61             int v = c[t];
62             if( v==sc ) continue;
63             if( !connect[sc][v] ) return false;
64         }
65     }
66     return true;
67 }
68 void init( int n ) {
69     memset( connect, false, sizeof(connect) );
70     for( int u=1; u<=n; u++ ) g[u].clear();
71 }
72 int main() {
73     while(1) {
74         scanf( "%d%d", &n, &m );
75         if( n==0 && m==0 ) return 0;
76         init(n);
77         for( int i=1,u,v; i<=m; i++ ) {
78             scanf( "%d%d", &u, &v );
79             connect[u][v] = connect[v][u] = true;
80             g[u].push_back(v);
81             g[v].push_back(u);
82         }
83         mcs();
84         printf( "%s\n\n", check() ? "Perfect" : "Imperfect" );
85     }
86 }

时间: 2024-10-05 23:25:06

ZOJ 1015 弦图判定的相关文章

bzoj 1242: Zju1015 Fishing Net 弦图判定

1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 214  Solved: 81[Submit][Status][Discuss] Description 在 一个高度信息化的渔村,鱼网的制作和修补都是由电脑完成.众所周知,鱼网是由网组成的(废话),网组成的东西叫网眼.如果网眼够小,就能捕到很多鱼:如果 网眼太大,鱼就会全部漏走.每次捕鱼回来,鱼网都会烂得很厉害,小网眼会变成网眼,那鱼网就需

ZOJ 1015 Fishing Net(弦图判定)

In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tools, fishing nets, are produced and fixed by computer. After catching fishes each time, together with plenty of fishes, they will bring back the shabby

弦图 完美消除序列 MCS算法

对于普通图的两个性质: 最大团数 ≤ 最小色数 最大独立集 ≤ 最小团覆盖 而在弦图就变成了: 最大团数=最小色数 最大独立集=最小团覆盖 (虽然不知道有什么用 完美消除序列: 对与序列中的点vi,排在vi后面并且和vi相连的点是一个团 一个图存在完美消除序列是它是弦图的充要条件 那么完美消除序列有什么用呢?用处可大啦 求弦图的最大团数/最小色数的时候,只要在完美消除序列上从后往前贪心染色即可. 而求最大独立集/最小团覆盖的时候,只要在完美消除序列上从前往后贪心取点即可. 那么就来了一系列的问题

[ZOJ 1015]Fishing Net(MCS弦图的判定)

Description In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tools, fishing nets, are produced and fixed by computer. After catching fishes each time, together with plenty of fishes, they will bring back

ZOJ 1015 Fishing Net(判断弦图)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=15 题意:给定一个图.判断是不是弦图? 思路:(1)神马是弦图?对于一个无向图,若该图的任意一个长度大于3的环中存在一条边连接这个环上不相邻的两点,则此图称作弦图. (2)什么是团?团是原图的一个子图,子图就是包含了原图的某些点,那么就要包含这些点之间的边.并且团不是一般的子图而是一个完全子图,就是这个子图的任意两个顶点之间都有边.下面的ABCD就是原图的一个团. (

ZOJ 1015 Fishing Net 弦图MCS

一个无向图是弦图当且仅当有一个完美消除序列. MCS最大势:http://wenku.baidu.com/view/07f4be196c175f0e7cd13784.html Fishing Net Time Limit: 10 Seconds      Memory Limit: 32768 KB In a highly modernized fishing village, inhabitants there make a living on fishery. Their major too

[BZOJ 1006] [HNOI2008] 神奇的国度 【弦图最小染色】

题目链接: BZOJ - 1006 题目分析 这道题是一个弦图最小染色数的裸的模型. 弦图的最小染色求法,先求出弦图的完美消除序列(MCS算法),再按照完美消除序列,从后向前倒着,给每个点染能染的最小颜色. 求出的颜色数就是最小染色,同时也是最大团. 代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <cstring> #in

bzoj 1006 弦图染色

给定一个弦图,问最少染色数. 对于弦图的一个完美消去序列,从后往前染色,每次染可以染的最小编号的颜色,由完美消去序列的定义,序列任一后缀的点的导出子图中,由该后缀第一个元素及其邻接点导出的子图一定是完全图,所以,序列中某一元素染的颜色编号是该完全图的大小.所以最小染色数小于等于最大团的点数,而显然前者又大于等于后者,故弦图的最小染色数等于最大团的大小. 1 /************************************************************** 2 Prob

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

1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1788  Solved: 775[Submit][Status] Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2...An之间仅存在N对认识关系:(A1A2)