初学图……很水的二染色。注意每一个连通图都要选个数少的那种颜色,如果一个点单独作为连通图必须放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 ",an); 72 else 73 printf("-1 "); 74 } 75 }