题目链接:http://acm.hdu.edu.cn/search.php?field=problem&key=2016ACM%2FICPC%D1%C7%D6%DE%C7%F8%B4%F3%C1%AC%D5%BE-%D6%D8%CF%D6%C8%FC%A3%A8%B8%D0%D0%BB%B4%F3%C1%AC%BA%A3%CA%C2%B4%F3%D1%A7%A3%A9&source=1&searchmode=source
A.染色乱搞。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef struct Edge { 5 int to, next; 6 }Edge; 7 8 const int maxn = 1010; 9 int n, m, x, y; 10 int know[maxn], vis[maxn], color[maxn]; 11 int ecnt, head[maxn]; 12 Edge e[maxn*maxn]; 13 14 void init() { 15 ecnt = 0; 16 memset(head, -1, sizeof(head)); 17 memset(know, 0, sizeof(know)); 18 memset(vis, 0, sizeof(vis)); 19 memset(color, 0, sizeof(color)); 20 } 21 22 void adde(int u, int v) { 23 e[ecnt].to = v, e[ecnt].next = head[u]; 24 head[u] = ecnt++; 25 } 26 27 bool dfs(int u) { 28 for(int i = head[u]; ~i; i=e[i].next) { 29 int v = e[i].to; 30 if(color[v] == color[u]) return 0; 31 if(vis[v]) continue; 32 vis[v] = 1; 33 color[v] = 3 - color[u]; 34 if(!dfs(v)) return 0; 35 } 36 return 1; 37 } 38 39 int main() { 40 // freopen("in", "r", stdin); 41 int u, v; 42 while(~scanf("%d%d%d%d",&n,&m,&x,&y)) { 43 init(); 44 for(int i = 0; i < m; i++) { 45 scanf("%d%d",&u,&v); 46 adde(u, v); adde(v, u); 47 know[u] = know[v] = 1; 48 } 49 for(int i = 0; i < x; i++) { 50 scanf("%d", &u); 51 color[u] = 1; know[u] = 1; 52 } 53 for(int i = 0; i < y; i++) { 54 scanf("%d", &u); 55 color[u] = 2; know[u] = 1; 56 } 57 bool flag = 0; 58 for(int i = 1; i <= n; i++) { 59 if(!know[i]) { 60 flag = 1; 61 break; 62 } 63 } 64 if(flag) { 65 puts("NO"); 66 continue; 67 } 68 for(int i = 1; i <= n; i++) { 69 if(color[i]) { 70 vis[i] = 1; 71 if(!dfs(i)) { 72 flag = 1; 73 break; 74 } 75 } 76 } 77 for(int i = 1; i <= n; i++) { 78 if(!color[i]) { 79 vis[i] = 1; 80 color[i] = 1; 81 if(!dfs(i)) { 82 flag = 1; 83 break; 84 } 85 } 86 } 87 if(!flag) puts("YES"); 88 else puts("NO"); 89 } 90 return 0; 91 }