codeforces 791B Bear and Friendship Condition
题目链接:http://codeforces.com/contest/791/problem/B
题意:n个人,共有m对关系。如果x和y有关系,y和z有关系,只有x和y有关系的时候才认为这样是合法的。现在问你输入是否合法。
分析:我是dfs做的,将每对关系存入vector,然后数组记录每一个人他一共有多少关系,然后dfs他,看和他有关系的人是不是关系数也和他一样。一旦有不一样的,就输出"NO".
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int a[150005]; 5 vector<int>g[150005]; 6 int vis[150005]; 7 int p=0,number; 8 void dfs(int x){ 9 int d=g[x].size(); 10 if(p==1) return; 11 vis[x]=1; 12 number++; 13 for(int i=0;i<d;i++){ 14 if(vis[g[x][i]]==0) { 15 if(a[g[x][i]]!=a[x]){ 16 p=1; 17 break; 18 } 19 dfs(g[x][i]); 20 } 21 } 22 } 23 int main() { 24 ios_base::sync_with_stdio(0); 25 cin.tie(0); 26 int n,m; 27 memset(a,0,sizeof(a)); 28 cin>>n>>m; 29 int x,y; 30 for(int i=1;i<=m;i++){ 31 cin>>x>>y; 32 g[x].push_back(y); 33 g[y].push_back(x); 34 a[x]++; 35 a[y]++; 36 } 37 memset(vis,0,sizeof(vis)); 38 for(int i=1;i<=n;i++){ 39 number=0; 40 if(vis[i]==0) { 41 dfs(i); 42 if(p==1||number!=a[i]+1) {p=1;break;} 43 } 44 } 45 if(p==0) cout<<"YES"<<endl; 46 else cout<<"NO"<<endl; 47 48 return 0; 49 }