cf791B(完全图&dfs)

本文解析了CodeForces上的一道题目,该题要求判断一个无向图是否满足特定条件形成完全图。通过DFS遍历算法来统计各连通分支的点数,并验证其是否构成完全图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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

 

转载于:https://www.cnblogs.com/geloutingyu/p/6589762.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值