zoukankan      html  css  js  c++  java
  • 【洛谷 1536】村村通

    题目描述

    某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府“村村通工程”的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?

    输入输出格式

    输入格式:

    每个输入文件包含若干组测试测试数据,每组测试数据的第一行给出两个用空格隔开的正整数,分别是城镇数目N(N<1000)和道路数目M;随后的M行对应M条道路,每行给出一对用空格隔开的正整数,分别是该条道路直接相连的两个城镇的编号。简单起见,城镇从1到N编号。

    注意:两个城市间可以有多条道路相通。例如:

    3 3 1 2 1 2 2 1 这组数据也是合法的。当N为0时,输入结束。

    输出格式:

    对于每组数据,对应一行一个整数。表示最少还需要建设的道路数目。

    输入输出样例

    输入样例#1: 复制
    4 2
    1 3
    4 3
    3 3
    1 2
    1 3
    2 3
    5 2
    1 2
    3 5
    999 0
    0
    
    输出样例#1: 复制
    1
    0
    2
    998

    题解:coding的快乐哈哈哈,真的有点水(相比dijkstra来说)

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    typedef long long ll;
    using namespace std;
    int fa[1000001], n, m, x, y;
    int find(int x){
        if(x!=fa[x])
            fa[x] = find(fa[x]);
        return fa[x]; 
    } 
    void jjj(int x, int y){
        int r1=find(x);
        int r2=find(y);
        fa[r1]=r2;
    }
    int main(){
        freopen("1536.in","r",stdin);
        freopen("1536.out","w",stdout);
        while(1){
            int ans=-1;
            scanf("%d", &n);
            if(n == 0) break;
            scanf("%d", &m);
            for(int i=1;i<=n;i++)
                fa[i] = i;
            for(int i=1;i<=m;i++){
                scanf("%d %d",&x,&y);
                jjj(x, y);
            }
            for(int i=1;i<=n;i++)
                if(find(i)==i) ans++;
            printf("%d
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    注册InstallShield
    java学习——异常处理
    IntellJ IDEA下写JUnit
    【转】光盘和U盘安装win7和ubuntu14.04全步骤
    上汽笔试题
    小白面试
    mysql
    HOWTO: Setup XCode 6.1 to work with OpenCV3 libraries
    [转]在MacOS和iOS系统中使用OpenCV
    [转]在 Mac OS X 终端里使用 Solarized 配色方案
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11129211.html
Copyright © 2011-2022 走看看