题解 | #畅通工程#

畅通工程

http://www.nowcoder.com/practice/4878e6c6a24e443aac5211d194cf3913

一、解题流程:

1. 循环输入城镇和道路数

2. 初始化:

  • 初始化2个数组 father,height(Initial函数)
  • 将所有城镇看为一个独立的个体,此时爸爸是自己,高度为0

3. 输入相连的城镇:

  • (1)查找城镇所在集合即“查找集合根节点”(Find函数)
  • (2)不在同一集合进行合并(Union函数)

4.计算需要的道路数:

  • (1)初始化answer为-1
  • (2)如果全部连通,则集合个数为1,只有根节点的父亲为自己,answer++为0,不需要添加道路
  • (3)如果是两个集合,说明还需要一条路连接这两个集合。有两个根节点的父亲为自己,answer++操作两次,answer=1。以此类推

二、代码如下(C++):

#include<iostream>
using namespace std;
const int MAXN=1000+10;
int father[MAXN];
int height[MAXN];

//初始化,每个城镇是一个独立的个体,爸爸是自己,高度为0
void Initial(int n)   
{
    for(int i=1;i<=n;i++)
    {
        father[i]=i;
        height[i]=0;
    }
    return ;
}

//找根节点,不断的Find(father【i】)
int Find(int x)
{
    if(x!=father[x])
        father[x]=Find(father[x]);  //路径压缩
    return father[x];
}

//合并
void Union(int x,int y)
{
    x=Find(x);  // 找到x的根节点
    y=Find(y);  // 找到y的根节点
    if(x!=y)    // 两个不是一个集合
    {
        if(height[x]<height[y])
            father[x]=y;
        else if(height[x]>height[y])
            father[y]=x;
        else
        {
            father[x]=y;
            height[y]++;
        }
    }
    return ;
}

int main()
{
    int n,m;  // n城镇 m道路
    while(cin>>n>>m) // 循环输入
    {
        if(n==0)     // 输入停止的判断
            break;
        
        Initial(n);  // 初始化所有道路
        while(m--)
        {
            int x,y;
            scanf("%d",&x);
            scanf("%d",&y);
            Union(x, y);  // 将城镇合并
        }
        
        int answer=-1;        // 记录还需要的道路数
        for(int i=1;i<=n;i++) // 循环遍历所有节点,看他们的根节点是否是自己
        {
            if(Find(i)==i)
                answer++;
        }
        printf("%d\n",answer);
    }
    return 0;
}
全部评论

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
4 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151571次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11203次浏览 101人参与
# 不去互联网可以去金融科技 #
20381次浏览 255人参与
# 和牛牛一起刷题打卡 #
18977次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203385次浏览 3627人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4972次浏览 30人参与
# OPPO开奖 #
19200次浏览 267人参与
# 通信硬件薪资爆料 #
265906次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2223次浏览 34人参与
# 互联网公司评价 #
97685次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25037次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454866次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53903次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14644次浏览 349人参与
# 硬件人的简历怎么写 #
82286次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19398次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28093次浏览 248人参与
# 学历对求职的影响 #
161237次浏览 1804人参与
# 你收到了团子的OC了吗 #
538720次浏览 6386人参与
# 你已经投递多少份简历了 #
344221次浏览 4963人参与
# 实习生应该准时下班吗 #
96976次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63524次浏览 622人参与
牛客网
牛客企业服务