HDU 1231 畅通工程 解题报告

问题描述

      在一个无向图中至少需要添加几条边使得改图是一个连通图。

问题分析

      容易证明:如果无向图的连通分量为k,则至少需要添加的边数cnt=k-1。无向图连通分量可以用幷查集来求解。定义set[i]表i所在的集合,则最终满足Find_set(i)=i的点的数目即为连通分量。

#include<iostream> #include<cstdio> #define Max 1001 using namespace std; int set[Max],rank[Max]; void Init(int n){ for(int i=1;i<=n;i++){ set[i]=i;rank[i]=0; } } int Find_set(int r){ if(set[r]-r) set[r]=Find_set(set[r]); return set[r]; } void Union(int x,int y){ x=Find_set(x);y=Find_set(y);//若写成x=set[x];y=set[y];将导致爆栈而RE! if(x-y){ if(rank[x]>rank[y]) set[y]=x; else{ if(rank[x]==rank[y]) rank[y]++; set[x]=y; } } } int main(){ int n,m; while(scanf("%d",&n),n){ scanf("%d",&m); Init(n); for(int i=0;i<m;i++){ int x,y; scanf("%d%d",&x,&y); Union(x,y); } int cnt=-1; for(int i=1;i<=n;i++) if(Find_set(i)==i) cnt++; printf("%d/n",cnt); } return 0; }

你可能感兴趣的:(HDU 1231 畅通工程 解题报告)