標籤:c++ 演算法 並查集 hdu 最佳化
這道題跟HDU 1213 How Many Tables 並查集非常接近,都是赤裸裸的並查集的題。
思路:假設還需要建n-1條路,每並一次就自減1。
參考代碼:
#include<stdio.h>int fa[1000];int find(int u){ return fa[u]==u?u:fa[u]=find(fa[u]);}int main(){ int i,n,m,u,v,x,y; scanf("%d%d",&n,&m); while (n) { for (i=1;i<=n;i++) fa[i]=i; for (i=1;i<=m;i++) { scanf("%d%d",&u,&v); x=find(u);y=find(v); if (x!=y) { fa[x]=y; n--; } } n--; printf("%d\n",n); scanf("%d%d",&n,&m); } return 0;}
最佳化:先用數組儲存m組數,然後只對這些節點的根節點
賦初值fa[u[i]]=u[i];fa[v[i]]=v[i];
參考代碼:
#include<stdio.h>int fa[1000],u[1000],v[1000];int find(int u){ return fa[u]==u?u:fa[u]=find(fa[u]);}int main(){ int i,n,m,x,y; scanf("%d%d",&n,&m); while (n) { for (i=1;i<=m;i++) { scanf("%d%d",&u[i],&v[i]); fa[u[i]]=u[i]; fa[v[i]]=v[i]; } for (i=1;i<=m;i++) { x=find(u[i]);y=find(v[i]); if (x!=y) { fa[x]=y; n--; } } n--; printf("%d\n",n); scanf("%d%d",&n,&m); } return 0;}