题解 | #连通图#

连通图

https://www.nowcoder.com/practice/569e89823a5141fe8a11ab7d4da21edf

#include <stdio.h>
//思想:并查集
//拥有同一祖先father的顶点一定是联通的,起初将每个顶点的祖先都设为自己,之后每读入一条边x1,x2都将x2的最终祖先的祖先设为x1的祖先
//从逻辑上讲,也就是将以x2祖先为根节点的连接树,接到以x1祖先为根节点的树上,这样两边树上的节点都联通了
//最终通过判断每个节点的最终祖先是否一样,一样则联通
//技巧:在构建祖先树的过程中,可以在找祖先函数Find中,将树高压缩,每次对一个x进行找祖先时候,都将x的直接父亲=x的原始祖先,降低树的高度
//使得最终判断时间能够减少
int father[1001];
int Find(int x) { //找到最原始祖先
  if (x == father[x]) {
    return x;
  } else {
    father[x] = Find(father[x]);
    return father[x];
  }
}

int main() {
  int n, m;
  while (scanf("%d%d", &n, &m) != EOF) {
    for (int i = 1; i <= n; i++) {
      father[i] = i;
    }

    int x1, x2;
    for (int i = 0; i < m; i++) { //记录边的点
      scanf("%d%d", &x1, &x2);
      father[Find(x2)] = Find(x1);

    }
    int tmp = Find(1);
    for (int i = 1; i <= n; i++) {
      if (Find(i) != tmp) {
        printf("NO\n");
        break;
      }
      if (i == n) {
        printf("YES\n");
      }
    }
  }
}

全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务