uva 10608 FRIENDS
生活随笔
收集整理的這篇文章主要介紹了
uva 10608 FRIENDS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
純粹考察并查集,算是一個經典問題;統計一個集合中有多少個元素,然后找到元素個數最多的集合
就普通的并查集,就能過了
然后另外寫了壓縮路徑,沒想到時間沒有改變
然后再寫一個,時間還是沒有改變,好吧……………………
只要懂基本的并查集的話,代碼都不成問題,很裸的并查集而已
?
代碼一:純粹
#include <cstdio> #include <cstring> #define N 30000 int p[N],c[N]; int n,m;int find(int x) { return p[x]==x ? x : p[x]=find(p[x]); }int main() {int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1; i<=n; i++){ p[i]=i; c[i]=0; }for(int i=1; i<=m; i++){int x,y,u,v;scanf("%d%d",&u,&v);x=find(u);y=find(v);if(x!=y)p[x]=y;}for(int i=1; i<=n; i++) //掃描所有元素找到他們的祖先然后祖先的孩子數計數 {int x=find(i);c[x]++;}int max=0;for(int i=1; i<=n; i++)if(c[i]>max)max=c[i];printf("%d\n",max);}return 0; }?
代碼二:壓縮路徑
#include <cstdio> #include <cstring> #define N 30000 int p[N],c[N]; int n,m;int find(int x) //迭代式 {int i=x,r=x,j;while(r!=p[r])r=p[r];while(i!=r) //路徑壓縮 {j=p[i]; //先記錄下i的雙親p[i]=r; //修改i的雙親直接與祖先相連i=j; //接下來修改原本的雙親 }return r; }int main() {int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1; i<=n; i++){ p[i]=i; c[i]=0; }for(int i=1; i<=m; i++){int x,y,u,v;scanf("%d%d",&u,&v);x=find(u);y=find(v);if(x!=y)p[x]=y;}for(int i=1; i<=n; i++) //掃描所有元素找到他們的祖先然后祖先的孩子數計數 {int x=find(i);c[x]++;}int max=0;for(int i=1; i<=n; i++)if(c[i]>max)max=c[i];printf("%d\n",max);}return 0; }?
代碼三:再修改一下統計集合元素的方法
#include <cstdio> #include <cstring> #define N 30000 int p[N],c[N]; int n,m;int find(int x) //迭代式 {int i=x,r=x,j;while(r!=p[r])r=p[r];while(i!=r) //路徑壓縮 {j=p[i]; //先記錄下i的雙親p[i]=r; //修改i的雙親直接與祖先相連i=j; //接下來修改原本的雙親 }return r; }int main() {int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1; i<=n; i++){ p[i]=i; c[i]=1; }int max=0;for(int i=1; i<=m; i++){int x,y,u,v;scanf("%d%d",&u,&v);x=find(u);y=find(v);if(x!=y){p[x]=y;c[y]+=c[x];if(c[y]>max)max=c[y];}}printf("%d\n",max);}return 0; }?
?
悲劇,時間沒本質提高啊………………………………
總結
以上是生活随笔為你收集整理的uva 10608 FRIENDS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS正则表达式的用法简介
- 下一篇: iOS开发点击UIButton实现UIV