当前位置: 首页 > news >正文

《算法笔记》9.6小节 数据结构专题(2)并查集 问题 A: 通信系统

题目描述

某市计划建设一个通信系统。按照规划,这个系统包含若干端点,这些端点由通信线缆链接。消息可以在任何一个端点产生,并且只能通过线缆传送。每个端点接收消息后会将消息传送到与其相连的端点,除了那个消息发送过来的端点。如果某个端点是产生消息的端点,那么消息将被传送到与其相连的每一个端点。
为了提高传送效率和节约资源,要求当消息在某个端点生成后,其余各个端点均能接收到消息,并且每个端点均不会重复收到消息。
现给你通信系统的描述,你能判断此系统是否符合以上要求吗?

输入

输入包含多组测试数据。每两组输入数据之间由空行分隔。
每组输入首先包含2个整数N和M,N(1<=N<=1000)表示端点个数,M(0<=M<=N*(N-1)/2)表示通信线路个数。
接下来M行每行输入2个整数A和B(1<=A,B<=N),表示端点A和B由一条通信线缆相连。两个端点之间至多由一条线缆直接相连,并且没有将某个端点与其自己相连的线缆。
当N和M都为0时,输入结束。

输出

对于每组输入,如果所给的系统描述符合题目要求,则输出Yes,否则输出No。

样例输入
4 3
1 2
2 3
3 4

3 1
2 3

0 0
样例输出
Yes
No

分析: 实际上就是给出一个图,判断这个图是否是一个没有环的连通图。从这个角度出发,可以检查这个图是否是一个连通图,且它的子图数量为1;也可以看做是否能构成一棵树。这个角度出发,一棵n个节点的树,只能有n-1条边,且每个节点只能有一个父节点。检查边数,并检查每个节点是否只有一个父节点即可。

代码用的是第二种方法。

#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include   <string>
#include   <vector>
#include   <cstdio>
#include    <queue>
#include    <stack>
#include    <ctime>
#include    <cmath>
#include      <map>
#include      <set>
#define INF 0xffffffff
#define db1(x) cout<<#x<<"="<<(x)<<endl
#define db2(x,y) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<endl
#define db3(x,y,z) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<endl
#define db4(x,y,z,r) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#r<<"="<<(r)<<endl
#define db5(x,y,z,r,w) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#r<<"="<<(r)<<", "<<#w<<"="<<(w)<<endl
using namespace std;

int main(void)
{
    #ifdef test
    freopen("in.txt","r",stdin);
    //freopen("in.txt","w",stdout);
    clock_t start=clock();
    #endif //test

    int n,m;
    while(scanf("%d%d",&n,&m),n||m)
    {
        int maps[n+5][n+5];
        for(int i=0;i<=n;++i)
            for(int j=0;j<=n;++j)
                maps[i][j]=0;
        for(int i=0;i<m;++i)
        {
            int a,b;scanf("%d%d",&a,&b);
            maps[a][b]=maps[b][a]=1;
        }
        if(n==1)
        {
            printf("Yes\n");continue;
        }
        if(m!=n-1)
        {
            printf("No\n");continue;
        }
        int flag[n+5]={0},cnt=n-1,f=1;
        flag[1]=1;maps[1][0]=1;
        queue<int>que;
        que.push(1);
        while(!que.empty())
        {
            int index=que.front();que.pop();
            for(int i=1;i<=n;++i)
            {
                if(i==index)continue;
                if(maps[index][i])
                {
                    if(flag[i]==0)
                    {
                        flag[i]=1,maps[i][0]=index,cnt--,que.push(i);
                    }
                    else if(flag[i]==1)
                    {
                        if(maps[index][0]==i)continue;
                        else
                        {
                            f=0;break;
                        }
                    }
                }
            }
            if(!f)break;
        }
        if(cnt==0&&f)printf("Yes\n");
        else printf("No\n");
    }

    #ifdef test
    clockid_t end=clock();
    double endtime=(double)(end-start)/CLOCKS_PER_SEC;
    printf("\n\n\n\n\n");
    cout<<"Total time:"<<endtime<<"s"<<endl;        //s为单位
    cout<<"Total time:"<<endtime*1000<<"ms"<<endl;    //ms为单位
    #endif //test
    return 0;
}

相关文章:

  • IO 和NIO有什么区别?
  • 2025.2.26总结
  • 机试刷题_面试题 08.08. 有重复字符串的排列组合【python】
  • 算法day1 dfs搜索2题
  • 智绘教:Windows平台上的高效悬浮窗画笔工具深度解析
  • mac 安装Eclipse,汉化及安装ERMaster
  • 搜索赋能:大型语言模型的知识增强与智能提升
  • mamba,mamba2环境搭建
  • # C/C++右移高位补0还是1?
  • eclipse配置Spring
  • 数据安全_笔记系列07:数据泄露防护(DLP)(监控与阻断敏感数据外泄)深度解析
  • AI创作教程:用deepseek和猫箱做互动故事游戏
  • NLP的预处理数据
  • 磁盘使用LVM方式挂载目录
  • 【xinference 词嵌入】embbeding 使用教程
  • 大白话Vue 双向数据绑定的实现原理与数据劫持技术
  • 【10】RUST的迭代器与闭包
  • Proof Beyond Boundaries: Hong Kong zkNight 活动精彩回顾
  • 零样本学习 zero-shot
  • LeetCodehot 力扣热题100 全排列
  • 坚持吃素,是不是就不会得高血脂了?
  • 新闻1+1丨城市,如何对青年更友好?
  • 遭“特朗普关税”冲击,韩国今年经济增长预期“腰斩”降至0.8%
  • 费高云不再担任安徽省人民政府副省长
  • 多地警务新媒体整合:关停交警等系统账号,统一信息发布渠道
  • 英国收紧移民政策,技术工作签证、大学招生面临更严要求