hdu 5971

题意:输入n,m,x,y;表示有n个人,输入m种对立关系,输入x个确认好人的标号,y个确认坏人的标号

思路:我们可以从确定的好人和坏人出发,有错误身份的输出NO,最后有不确定的输出NO,否则YES。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 map<int ,int >mp;
 4 vector<int >p[1003];
 5 int sum,f;
 6 void init(){
 7     mp.clear();
 8     for(int i=0;i<1003;i++)
 9         p[i].clear();
10     sum=0;f=0;
11 }
12 void dfs(int x,int y) {
13    if(f) return ;
14    for(int i=0;i<p[x].size();i++){
15     if( mp[p[x][i]]==y )  { f=1; return ;}
16       if( mp[p[x][i]]==0 ){
17         sum++;
18         mp[p[x][i]]=-y;
19         dfs(p[x][i],-y);
20      }
21    }
22 }
23 int main()
24 {
25     int n,m,x,y;
26     int a,b;
27     while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF){
28             init();
29         for(int i=1;i<=m;i++) {
30             scanf("%d%d",&a,&b);
31             p[a].push_back(b);p[b].push_back(a);
32         }
33        
34         for(int i=1;i<=x;i++){
35             scanf("%d",&a);
36             if(f==1) continue;
37             if(mp[a]==-1) {f=1;continue;}
38             if(mp[a]==0) {
39                mp[a]=1; dfs(a,1);sum++;
40             }
41         }
42         for(int i=1;i<=y;i++) {
43             scanf("%d",&b);
44             if(f==1) continue;
45             if(mp[b]==1) {f=1;continue;}
46             if(mp[b]==0){
47                 mp[b]=-1;dfs(b,-1);sum++;
48             }
49         }
50         for(int i=1;i<=n;i++){
51             if(mp[i]==0){
52                 if(p[i].size()==0){f=1;break;}
53                 mp[i]=1;
54                 sum++;
55                 dfs(i,1);
56             }
57         }
58         if(sum==n&&f==0) printf("YES
");
59         else  printf("NO
");
60     }
61     return 0;
62 }
原文地址:https://www.cnblogs.com/hhxj/p/6954062.html