1. 程式人生 > >ZOJ 1015 Fishing Net(弦圖判定)

ZOJ 1015 Fishing Net(弦圖判定)

mcs main 如何 ext using typedef lan puts push

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=15

題意:

判斷是否是弦圖。

思路:

所謂弦圖,也就是對於一個無向圖,若該圖的任意一個長度大於3的環中存在一條邊連接這個環上不相鄰的兩點,則此圖稱作弦圖。

弦圖的判斷不難,先用最大勢算法計算出完美消除序列,然後用完美消除序列判斷原圖是否是弦圖,如何從完美消除序列判斷原圖是不是弦 圖?最樸素的辦法是依次判斷 {vi+1,…,vn}中所有與vi相鄰的點是否構成了一個團。可以這樣優化:設{vi+1,…,vn}中所有與vi相鄰的點依次為 vj1,……,vjk。只需判斷vj1是否與vj2,……,vjk相鄰即可。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<sstream>
 6 #include<vector>
 7 #include<stack>
 8 #include<queue>
 9 #include<cmath>
10 #include<map>
11 #include<set>
12
using namespace std; 13 typedef long long ll; 14 typedef pair<int,ll> pll; 15 const int INF = 0x3f3f3f3f; 16 const int maxn=1000+5; 17 18 int n, m; 19 int tot; 20 int head[maxn]; 21 int label[maxn]; //label[i]表示第i個點與多少個已標號的點相鄰,每次選擇label[i]最大的未標號的點進行標號 22 int vis[maxn]; 23 int q[maxn]; 24
int mp[maxn][maxn]; 25 26 struct node 27 { 28 int v; 29 int next; 30 }e[maxn*maxn+5]; 31 32 void addEdge(int u, int v) 33 { 34 e[tot].v=v; 35 e[tot].next=head[u]; 36 head[u]=tot++; 37 } 38 39 void MCS() //最大勢算法 40 { 41 memset(vis,0,sizeof(vis)); 42 memset(label,0,sizeof(label)); 43 for(int i=n;i;i--) 44 { 45 int pos=0; 46 for(int j=1;j<=n;j++) //選擇當前未訪問且label值最大的 47 if(!vis[j] && label[j]>=label[pos]) pos=j; 48 vis[pos]=1; 49 q[i]=pos; 50 for(int j=head[pos];j!=-1;j=e[j].next) //與pos結點相鄰的結點label值+1 51 label[e[j].v]++; 52 } 53 } 54 55 bool check() 56 { 57 for(int i=1;i<=n;i++) 58 { 59 vector<int> v; 60 for(int j=i+1;j<=n;j++) 61 if(mp[q[i]][q[j]]==1) v.push_back(q[j]); 62 for(int j=1;j<v.size();j++) 63 if(mp[v[0]][v[j]]==0) return false; 64 } 65 return true; 66 } 67 68 int main() 69 { 70 //freopen("in.txt","r",stdin); 71 while(scanf("%d%d",&n,&m)!=EOF) 72 { 73 if(n==0 && m==0) break; 74 tot=0; 75 memset(head,-1,sizeof(head)); 76 memset(mp,0,sizeof(mp)); 77 while(m--) 78 { 79 int u,v; 80 scanf("%d%d",&u,&v); 81 addEdge(u,v); 82 addEdge(v,u); 83 mp[u][v]=mp[v][u]=1; 84 } 85 MCS(); 86 if(check()==true) puts("Perfect\n"); 87 else puts("Imperfect\n"); 88 } 89 return 0; 90 }

ZOJ 1015 Fishing Net(弦圖判定)