(二分图染色)uva 11080 ——Place the Guards

题目地址

初学图……很水的二染色。注意每一个连通图都要选个数少的那种颜色,如果一个点单独作为连通图必须放1个士兵。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <vector>
 6 using namespace std;
 7 int t;
 8 int v,e;//点数,边数
 9 vector <int> g[205];
10 int x,y;
11 int col[205];
12 int cnt;
13 bool flag;
14 int ge;
15 bool dfs(int v,int c)
16 {
17     col[v]=c;
18     ge++;
19     if(c==1)
20         cnt++;
21     for(int i=0;i<g[v].size();i++)
22     {
23         if(col[g[v][i]]==c)
24             return false;
25         if(col[g[v][i]]==-1)
26         {
27             if(!dfs(g[v][i],c^1))
28                 return false;
29         }
30     }
31     return true;
32 }
33 int an;
34 int main()
35 {
36     scanf("%d",&t);
37     while(t--)
38     {
39         an=0;
40         flag=true;
41         memset(col,-1,sizeof(col));
42         scanf("%d %d",&v,&e);
43         for(int i=0;i<v;i++)
44             g[i].clear();
45         for(int i=0;i<e;i++)
46         {
47             scanf("%d %d",&x,&y);
48             g[x].push_back(y);g[y].push_back(x);
49         }
50         for(int i=0;i<v;i++)
51         {
52             if(col[i]==-1)
53             {
54                 cnt=0;
55                 ge=0;
56                 if(!dfs(i,1))
57                 {
58                     flag=false;
59                     break;
60                 }
61                 else
62                     {
63                         if(ge!=1)
64                             an+=min(cnt,ge-cnt);
65                         else
66                             an+=1;
67                     }
68             }
69         }
70         if(flag)
71             printf("%d\n",an);
72         else
73             printf("-1\n");
74     }
75 }

 

posted @ 2017-03-13 16:36  perplex  阅读(216)  评论(0编辑  收藏  举报