生活随笔
收集整理的這篇文章主要介紹了
村村通(并查集)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
村村通
(來自Luogu P1536)
題目概述
某市調查城鎮交通狀況,得到現有城鎮道路統計表。表中列出了每條道路直接連通的城鎮。市政府“村村通工程”的目標是使全市任何兩個城鎮間都可以實現交通(但不一定有直接的道路相連,只要相互之間可達即可)。請你計算出最少還需要建設多少條道路?
注意:兩個城市間可以有多條道路相通。當N為0時,輸入結束。
數據規模
N<1000
思路
這個題是裸的并查集題目,這個題就是求并查集數量-1(類似于生成樹思想)的結果,廢話不多說,上代碼。
代碼
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int i,j,fa[
1001],m,n;
int b[
1001];
int r()
{
int aans=
0,f=
1;
char ch=getchar();
while(ch<
'0'||ch>
'9'){
if(ch==
'-')f=-
1;ch=getchar();}
while(ch>=
'0'&&ch<=
'9'){aans*=
10;aans+=ch-
'0';ch=getchar();}
return aans*f;
}
int findd(
int x)
{
if(fa[x]==x)
return x;fa[x]=findd(fa[x]);
return fa[x];
}
void unionn(
int x,
int y)
{
int fx=findd(x);
int fy=findd(y);
if(fx==fy)
return;fa[fx]=fy;
}
int main()
{n=r();
int x,y,cnt;
while(n){cnt=
0;m=r();
for(i=
1;i<=n;i++)fa[i]=i;
for(i=
1;i<=m;i++){x=r(),y=r();unionn(x,y);}
for(i=
1;i<=n;i++){
if(!b[findd(i)])b[findd(i)]=
1,cnt++;}
printf(
"%d\n",cnt-
1);
memset(b,
0,
sizeof(b));n=r();}
}
總結
以上是生活随笔為你收集整理的村村通(并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。