傳送門php
•題意
給出 n 我的,m 場比賽;c++
這 m 場比賽,每一場比賽中的對決的兩人,一個屬於 "good player" 另外一個屬於 "bad player";ide
給出你 x 個已經肯定的"good player" 和 y 個已經肯定的 "bad player"。spa
問是否能夠將這 n 我的劃分紅兩類,其中一類屬於 "good player",另外一類屬於 "bad player";code
即不存在某人即屬於 "good player" 又屬於 "bad player";blog
若是能,輸出 "YES",反之,輸出 "NO";ci
•題解
對於每一場比賽的兩人 $u,v$,連一條雙向邊 $u\rightarrow v\ ,\ v\rightarrow u$; get
而後 DFS 染色。 it
先從已經肯定的 $x+y$ 我的開始,染色與其相關的人,矛盾就輸出 "NO"; event
而後對於不肯定的人,枚舉染色, 矛盾就輸出 "NO";
若是不存在矛盾,輸出 "YES";
•Code
View Code1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e3+50; 4 const int M=1e4+50; 5 6 int n,m,x,y; 7 int num; 8 int head[N]; 9 struct Edge 10 { 11 int to; 12 int next; 13 }G[M<<1]; 14 void addEdge(int u,int v) 15 { 16 G[num]={v,head[u]}; 17 head[u]=num++; 18 } 19 int col[N];///0:Good , 1:bad 20 int g[N]; 21 int b[N]; 22 bool ok; 23 24 void DFS(int u,int flag) 25 { 26 col[u]=flag; 27 for(int i=head[u];~i && !ok;i=G[i].next) 28 { 29 int v=G[i].to; 30 31 if(col[v] == -1) 32 DFS(v,flag^1); 33 34 if(col[v] == col[u])///u,v對立,若是出現col[u]=col[v],矛盾 35 ok=true; 36 } 37 } 38 char *Solve() 39 { 40 for(int i=1;i <= x;++i) 41 { 42 int u=g[i]; 43 ok=false; 44 if(col[u] == -1) 45 DFS(u,0); 46 if(ok || col[u] == 1) 47 return "NO"; 48 } 49 for(int i=1;i <= y;++i) 50 { 51 int u=b[i]; 52 if(col[u] == -1) 53 DFS(u,1); 54 55 if(ok || col[u] == 0) 56 return "NO"; 57 } 58 for(int i=1;i <= n;++i) 59 { 60 ok=false; 61 if(col[i] == -1 && head[i] != -1) 62 DFS(i,0); 63 64 if(ok) 65 return "NO"; 66 } 67 return "YES"; 68 } 69 void Init() 70 { 71 num=0; 72 for(int i=0;i <= n;++i) 73 { 74 col[i]=-1; 75 head[i]=-1; 76 } 77 } 78 int main() 79 { 80 // freopen("C:\\Users\\hyacinthLJP\\Desktop\\C++WorkSpace\\in&&out\\contest","r",stdin); 81 while(~scanf("%d%d%d%d",&n,&m,&x,&y)) 82 { 83 Init(); 84 for(int i=1;i <= m;++i) 85 { 86 int u,v; 87 scanf("%d%d",&u,&v); 88 addEdge(u,v); 89 addEdge(v,u); 90 } 91 for(int i=1;i <= x;++i) 92 scanf("%d",g+i); 93 for(int i=1;i <= y;++i) 94 scanf("%d",b+i); 95 puts(Solve()); 96 } 97 return 0; 98 }