B - Bicoloring (二分图判定)

 

B - Bicoloring

题意:判断此图是否为二分图(染色法,相邻两点不同色)

AC代码:

 1 /***********************************************/
 2 
 3 int co[250];
 4 
 5 struct node{
 6     int v;
 7     node(){}
 8     node(int _v):v(_v){}
 9 };
10 vector<node>G[250];//邻接表法 
11 
12 int fff=0;
13 
14 void dfs(int now,int pre)
15 {
16     if(~co[now])
17     {
18         if(co[pre]!=0) co[now]=-co[pre];
19         else co[now]=1;//头结点染色
20         //cout<<"co"<<G[now].size()<<endl;
21         for(int i=0;i<G[now].size();i++)
22         {
23             if(fff==0 && G[now][i].v!=pre)
24             dfs(G[now][i].v,now);
25         }
26     }
27         
28     else{//染过 
29         if(co[now]==co[pre]){
30             fff=1;
31         }
32     } 
33     
34 }
35 
36 int main()
37 {
38     int n,m;
39     while(cin>>n && n)
40     {
41         fff=0;
42         mem0(G);
43         cin>>m;
44         for(int i=1;i<=m;i++){
45             int a,b;
46             cin>>a>>b;
47             G[a].push_back(node(b));
48             G[b].push_back(node(a)); 
49         }
50         mem0(co);
51         dfs(0,0);
52         //for(int i=0;i<n;i++) cout<<co[i]<<"tt";
53         if(fff){
54             cout<<"NOT BICOLORABLE."<<endl;
55         }
56         else cout<<"BICOLORABLE."<<endl;
57     }
58     return 0;
59 }
60 
61 /*
62 3
63 3
64 0 1
65 1 2
66 2 0
67 3
68 2
69 0 1
70 1 2
71 9
72 8
73 0 1
74 0 2
75 0 3
76 0 4
77 0 5
78 0 6
79 0 7
80 0 8
81 0
82 
83 */
View Code

猜你喜欢

转载自www.cnblogs.com/liuyongliu/p/10319379.html