zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    常用Linux命令
    SQL必知必会-笔记
    【ubuntu】install openbox+tint2+bmenu on ubuntu12.04.4
    【ruby】安装Ruby
    【ruby】快速安装gems的方法
    【sinatra】设置默认的端口
    【sinatra】修改默认ip绑定
    【sinatra】结合Padrino framework
    【sinatra】安装测试
    【rails3教材】博客构建过程2
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6589762.html
Copyright © 2011-2022 走看看