zoukankan      html  css  js  c++  java
  • hdu畅通工程(并查集)

    Problem Description
    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 
    注意:两个城市之间可以有多条道路相通,也就是说
    3 3
    1 2
    1 2
    2 1
    这种输入也是合法的
    当N为0时,输入结束,该用例不被处理。 
     
    Output
    对每个测试用例,在1行里输出最少还需要建设的道路数目。 
     
    Sample Input
    
    
    4 2
    1 3
    4 3
     
     
    3 3
    1 2
    1 3
    2 3
     
     
    5 2
    1 2
    3 5
     
     
    999 0
     
     
    0
     
    Sample Output
    
    
    1
     
    0
     
    2
     
    998
     

    原题目链接:http://hdu.hustoj.com/showproblem.php?pid=1232

    并查集:并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。(取自360百科)

                        虽然这题用我们以前的暴力也能解题,但是到数据过大的时候会超时,所以此处就考虑到了时间复杂度,所以要用并查集,大大的减少了输出答案所需要的时间。

    该题其实很简单,应该算是并查集的入门题吧。

    题目, 比如样例: 

    5 2 (n=5,m=2)

    1 2 城镇1 2相连

    3 5 城镇3 5相连 那么(1,2) (3,5) (4) 总共有3个集合,集合数目-1就是答案。

    又比如说 1,3相连 3,5相连 5,7相连 3.9相连

    用通俗的说法 3的父亲是1 5的父亲是3,5的爷爷是1, 7的父亲是5.....后面所有的与该相通的祖宗都是同一个。然后再后面的步骤中,将同一个祖宗的城镇,改值。

    贴上代码:

    #include<stdio.h>
    int bin[1010];
    int findx(int x)
    {
    int r=x;
    while (bin[r]!=r)             //改变原城镇的初始值
    r=bin[r];
    return r;
    }
    void merge(int x,int y)
    {
    int fx,fy;
    fx=findx(x);
    fy=findx(y);
    if (fx!=fy)
    bin[fx]=fy;
    }
    int main()
    {
    int n,m,x,y,i,ans;
    while (scanf("%d%d",&n,&m)&&n)
    {
    for (i=1;i<=n;i++)              //对城镇初始化
    bin[i]=i;
    if (m==0)   
    printf ("%d ",n-1);
    else{
    for (;m>0;m--){
    scanf ("%d%d",&x,&y);
    merge(x,y);
    }
    for (ans=0,i=1;i<=n;i++)
    if (bin[i]==i)               // 计数 有几个城镇集合
    ans++;
    printf ("%d ",ans-1);
    }
    }
    return 0;
    }

  • 相关阅读:
    Linux tar指令
    关于Json-lib类库的使用
    安卓开发笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)
    安卓开发笔记——TabHost组件(二)(实现底部菜单导航)
    安卓开发笔记——TabHost组件(一)(实现底部菜单导航)
    安卓开发笔记——ViewPager组件(仿微信引导界面)
    安卓开发笔记——Menu菜单组件(选项菜单,上下文菜单,子菜单)
    安卓开发笔记——Gallery组件+ImageSwitcher组件
    安卓开发笔记——GridView组件
    安卓开发笔记——WebView组件
  • 原文地址:https://www.cnblogs.com/q1204675546/p/8613208.html
Copyright © 2011-2022 走看看