HDU 5971"Wrestling Match"(二分圖染色)

 

傳送門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

 1 #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 }
View Code
相關文章
相關標籤/搜索