HDU 1232 暢通工程 (並查集)
阿新 • • 發佈:2018-12-18
一題並查集的題目,採用並查集的方式。
AC程式碼如下:
#include <iostream>
#include <set>
#include <cstring>
using namespace std;
const int maxn=1e3+5;
int pre[maxn]; //儲存該節點的父節點
int son[maxn]; //用來儲存該節點中結點個數
int Find(int x) //查詢父節點
{
int r=x;
while(pre[r]!=r)
r=pre[r];
pre[x]=r;
return r;
}
void Union(int x,int y)
{
int fx,fy;
fx=Find(x);
fy=Find(y);
if(fx!=fy) //這裡每次都合併子節點個數多的以便減少修路的次數
{
if(son[fx]<son[fy])
{
pre[fx]=fy;
son[fy]+=son[fx];
son[fx]=0;
}
else
{
pre[fy]=fx;
son[ fx]+=son[fy];
son[fy]=0;
}
}
return ;
}
int main()
{
int N,M;
while(cin>>N && N)
{
memset(son,1,sizeof(son)); //先使子節點個數都處理為1
cin>>M;
for(int i=1;i<=N;i++) //初始化父節點
pre[i]=i;
int x,y;
for( int i=0;i<M;i++)
{
cin>>x>>y;
Union(x,y); //兩點之間修路
}
int sum=0;
for(int i=1;i<=N-1;i++)
{
if(Find(i)!=Find(i+1)) //問還要修多少條路
{
sum++;
Union(i,i+1);
}
}
cout<<sum<<endl; //最後輸出路的條數
}
return 0;
}