HDU 1232 畅通工程(并查集之一)

问题描述:

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

代码思路:

这题就是对并查集模板的套用。

find(int x)函数用来寻找x的根节点。

join(int x,int y)函数用来使x,y两个节点合在一个集合内。

代码:

import java.util.Scanner;
import java.util.Arrays;
import java.math.BigInteger;
public class Main{
    static int n,m;
    static int[] isRoot=new int[2000];
    static int[] pre=new int[2000];
     static Scanner in=new Scanner(System.in);
    public static void main(String args[]){
        int count;
        while(in.hasNextInt()){
            n=in.nextInt();
            if(n==0)
                break;
            m=in.nextInt();
            count=0;
            int x,y;
            for(int i=1;i<=n;i++){
                isRoot[i]=1;
                pre[i]=i;
            }
            for(int i=0;i<m;i++){
                x=in.nextInt();
                y=in.nextInt();
                mix(x,y);
            }
            for(int i=1;i<=n;i++)
                if(find(i)==i)
                    count++;
            System.out.println(count-1);
        }
    }
    public static int find(int x){
        int r=x;
        while(r!=pre[r]){
            r=pre[r];
        }
        int i=x,j;
        while(i!=r){
            j=pre[i];
            pre[i]=r;
            i=j;
        }
        return r;
    }
    public static void mix(int x,int y){
        int fx=find(x);
        int fy=find(y);
        if(fx!=fy){
            pre[fy]=fx;
        }
    }
}

时间: 2024-08-08 09:39:00

HDU 1232 畅通工程(并查集之一)的相关文章

HDU 1232 畅通工程(并查集)

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30485    Accepted Submission(s): 16013 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有

HDU ACM 1232 畅通工程-&gt;并查集

分析: 地图上有若干个城镇,城镇都可以看作点,然后给出哪些城镇之间是直接相连的.要解决的是整幅图的连通性问题.比如两个点,判断它们是否连通,或者整幅图共有几个连通分支,就是被分成多少个互相独立的块.因此这个题实质就是求有几个连通分支:如果是1个,则整幅图都连起来了:如果是2个,只要再修1条路,在两个分支中各选一个点,连起来,这样所有点就连起来了:3个连通分支,则只需再修两条......,这样就可以使用并查集很好的解决了. #include<iostream> using namespace s

hdu 1863 畅通工程 (并查集+最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17593    Accepted Submission(s): 7417 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交

hdu 1863 畅通工程 (并查集 、 kruskal)

畅通工程Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 37969    Accepted Submission(s): 16915 Problem Description省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有

HDU - 1232 畅通工程 HDU - 1874畅通工程续 HDU - 1875畅通工程再续

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1232 题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1875 畅通工程属于水题,直接用并查集就行,加个路径压缩那就更好. 畅通工程续这道题WA了N次,因为有一个地方没注意到就是一个城镇到另外一个城镇的有多条道路, 所以你一开始就要把最短的道路选出来.

HDU1232 畅通工程 并查集

这道题跟HDU 1213 How Many Tables 并查集非常接近,都是赤裸裸的并查集的题. 思路:假设还需要建n-1条路,每并一次就自减1. 参考代码: #include<stdio.h> int fa[1000]; int find(int u) { return fa[u]==u?u:fa[u]=find(fa[u]); } int main() { int i,n,m,u,v,x,y; scanf("%d%d",&n,&m); while (n

HDU 1243 畅通工程 并査集

Total Submission(s): 31033    Accepted Submission(s): 16313 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( &l

hdu 1232 畅通工程(最小生成树)

Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号.为简单起见,城镇从1

hdu 1232 畅通工程(并查集算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 31088    Accepted Submission(s): 16354 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条

HDU 1232 畅通工程 (并查集)

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号.为简单起见,城镇从1到N编号. 注意:两个城市之间可以有多条道