1. 程式人生 > >HDU 1232 暢通工程 (並查集)

HDU 1232 暢通工程 (並查集)

一題並查集的題目,採用並查集的方式。

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; }