cf791B(完全图&dfs)

题目链接:http://codeforces.com/contest/791/problem/B

 

题意:给出一个无向图,问是否满足若存在边ab, bc则存在边ac;

 

思路:题意即,对于一个点,其所有子节点都是相互可达的,即为完全图,不过给出的不一定是连通图,所以我们需要判断所有连通分支是否全为为完全图;

因为题目说明了没有重边和自环的情况,那么我们可以统计每个点的度数,对于某个连通分支若其所有点的度数等于当前连通分支点数-1,那么其为完全图;

那么我们只需dfs一下连通分支并统计每个连通分支的点数即可;

 

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <vector>
 4 using namespace std;
 5 
 6 const int MAXN=2e5;
 7 vector<int> mp[MAXN];
 8 int num[MAXN], ans=0;
 9 bool flag=false, vis[MAXN];
10 
11 void dfs(int v, int cnt){
12     ans++;
13     if(flag){
14         return;
15     }
16     if(mp[v].size()!=cnt){
17         flag=true;
18         return;
19     }
20     for(int i=0; i<mp[v].size(); i++){
21         if(!vis[mp[v][i]]){
22             vis[mp[v][i]]=true;
23             dfs(mp[v][i], cnt);
24         }
25     }
26 }
27 
28 int main(void){
29     int n, m, x, y;
30     scanf("%d%d", &n, &m);
31     while(m--){
32         scanf("%d%d", &x, &y);
33         mp[x].push_back(y);
34         mp[y].push_back(x);
35         num[x]++;
36         num[y]++;
37     }
38     for(int i=1; i<=n; i++){
39         if(!vis[i]){
40             ans=0;
41             vis[i]=true;
42             dfs(i, num[i]);
43             if(flag||ans!=num[i]+1){
44                 cout << "NO" << endl;
45                 return 0;
46             }
47         }
48     }
49     cout << "YES" << endl;
50     return 0;
51 }
View Code

 

posted @ 2017-03-20 16:06  geloutingyu  阅读(1270)  评论(0编辑  收藏  举报