HDU 1856 More is better 解题报告

模型抽象

     无向图最大连通分量问题。输出最大连通子图中顶点的数目。

解题报告

     这是道幷查集的题目。将每条边都并入集合之后,设num[i]保存第i个连通子图中的顶点个数。则遍历每一个顶点,通过“num[Find_set(i)]++”实现求解num[i]的值。

#include #include # define Max 10000001 using namespace std; int set[Max],rank[Max],num[Max],frd[100001][2]; void Init(int n){ for(int i=1;i<=n;i++){ set[i]=i;rank[i]=0;num[i]=0; } } int Find_set(int r){ if(r-set[r]) set[r]=Find_set(set[r]); return set[r]; } void Union(int x,int y){ x=Find_set(x);y=Find_set(y); 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; while(scanf("%d",&n)!=-1){ if(n==0) printf("1/n");//这是细节啊,害我WA一次! else { int count=0; for(int i=0;icount) count=frd[i][0]; if(frd[i][1]>count) count=frd[i][1]; } Init(count); for(int i=0;icnt) cnt=num[i]; printf("%d/n",cnt); } } return 0; }

你可能感兴趣的:(数据结构与算法,ini)