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 }
我就是我,颜色不一样的烟火 --- geloutingyu