通信系统 - 并查集/搜索

题目地址:http://www.51cpc.com/web/problem.php?id=4260

 

Summarize:

1. 从图的角度来看就是求有无环;由于对图一窍不通,这里我用的是搜索;

2. 此外可以用并查集来做,是否存在多个根节点,若不止一个则不符合题意;

 

附搜索代码:

#include<iostream>
#include<cstring>
#define inf 1e9
typedef long long LL;
using namespace std;
 
const int N = 1e3+5;
LL n, m, vis[N], edge[N][N], count, flag=0;
 
void dfs(int x, int pre)
{
    if(count == n) return;
    if(flag) return;
     
    for(int i=1; i<=n; i++) {
        if(edge[x][i] && x!=i && i!=pre) {
            if(vis[i]) {
                flag = 1;
                break;
            }
            vis[i] = 1;
            count++;
            dfs(i,x);
        }
    }
}
 
int main()
{
    while(cin>>n>>m)
    {
        if(!n && !m) return 0;
         
        memset(vis, 0, sizeof(vis));
        memset(edge, 0, sizeof(edge));
         
        for(int a,b,i=0; i<m; i++) {
            cin>>a>>b;
            edge[a][b] = edge[b][a] = 1;
        }
        vis[1]=1;
        flag=0;
        count = 1;
        dfs(1, -1);
         
        if(count<n || flag) cout<<"No"<<endl;
        else cout<<"Yes"<<endl;
         
    }
}

  

posted @ 2018-07-30 21:37  liubilan  阅读(148)  评论(0编辑  收藏  举报