暢通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 59587 Accepted Submission(s): 31854
Problem Description
某省調(diào)查城鎮(zhèn)交通狀況削饵,得到現(xiàn)有城鎮(zhèn)道路統(tǒng)計(jì)表诈嘿,表中列出了每條道路直接連通的城鎮(zhèn)碌燕。省政府“暢通工程”的目標(biāo)是使全省任何兩個(gè)城鎮(zhèn)間都可以實(shí)現(xiàn)交通(但不一定有直接的道路相連骑篙,只要互相間接通過道路可達(dá)即可)椎组。問最少還需要建設(shè)多少條道路奋献?
?
Input
測(cè)試輸入包含若干測(cè)試用例案训。每個(gè)測(cè)試用例的第1行給出兩個(gè)正整數(shù)斋配,分別是城鎮(zhèn)數(shù)目N ( < 1000 )和道路數(shù)目M孔飒;隨后的M行對(duì)應(yīng)M條道路,每行給出一對(duì)正整數(shù)艰争,分別是該條道路直接連通的兩個(gè)城鎮(zhèn)的編號(hào)坏瞄。為簡(jiǎn)單起見,城鎮(zhèn)從1到N編號(hào)甩卓。
注意:兩個(gè)城市之間可以有多條道路相通,也就是說
3 3
1 2
1 2
2 1
這種輸入也是合法的
當(dāng)N為0時(shí)鸠匀,輸入結(jié)束,該用例不被處理逾柿。
?
Output
對(duì)每個(gè)測(cè)試用例缀棍,在1行里輸出最少還需要建設(shè)的道路數(shù)目。
?
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
Solution
這是一個(gè)最小生成樹和并查集問題机错,先使用并查集處理隨后在查看有多少未聯(lián)通的城鎮(zhèn)即有多少點(diǎn)的根結(jié)點(diǎn)為其本身
Code
/**
* date:2017.11.20
* author:孟小德
* function:杭電acm1232
* 暢通工程 使用查并集方法
*/
import java.util.*;
public class acm1232
{
public static int[] father;
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int N,M;
int result;
while (input.hasNextInt())
{
N = input.nextInt();
if (N == 0)
{
break;
}
M = input.nextInt();
father = new int[N+1];
for (int i=1;i<N+1;i++)
{
father[i] = i;
}
for (int i=0;i<M;i++)
{
int a = input.nextInt();
int b = input.nextInt();
union(a,b);
}
result = 0;
//若該樹是聯(lián)通的爬范,那么只有一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)是其自身
for (int i=1;i<N+1;i++)
{
if (father[i] == i)
{
result++;
}
}
System.out.println(result - 1);
}
}
public static void union(int m,int n)
{
//合并集合
int a = getParent(m);
int b = getParent(n);
if (a!=b)
{
father[a] = b;
}
}
public static int getParent(int m)
{
//尋找節(jié)點(diǎn)的根節(jié)點(diǎn)
while (father[m] != m)
{
m = father[m];
}
return m;
}
}