标签:cout std blog through print lap http ima gif
并查集一个神奇的算法
今天我们的s同学想学习一下并查集,就去找了几个水题刷一下...
入门题_1:P2839 畅通工程
畅通工程
就是求联通块的数量,-1就是答案。
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int read(){ int f=1,an=0; char ch=getchar(); while(!(‘0‘<=ch&&ch<=‘9‘)){if(ch==‘-‘)f=-f;ch=getchar();} while(‘0‘<=ch&&ch<=‘9‘){an=an*10+(ch-‘0‘);ch=getchar();} return f*an; } int f[1000+99];bool c[1000+99]; int n,m,ans; int from,to; void add(int x,int y){ int xx=x,yy=y; while(xx!=f[xx])xx=f[xx]; while(yy!=f[yy])yy=f[yy]; if(xx!=yy)f[xx]=yy; } int find(int i){ int k=i; while(f[k]!=k){c[k]=0;k=f[k];} } int main(){ n=read();m=read(); for(int i=1;i<=n;i++){f[i]=i;c[i]=1;} for(int i=1;i<=m;i++){ from=read(); to=read(); add(from,to); } for(int i=1;i<=n;i++){ find(i);} for(int i=1;i<=n;i++)if(c[i])ans++; cout<<ans-1; return 0; }
是不是很简单
然后提高题_1
P1525 关押罪犯
关押罪犯
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; const int maxn=100000+99999; int read(){ int an=0,f=1; char ch=getchar(); while(!(‘0‘<=ch&&ch<=‘9‘)){if(ch==‘-‘);ch=getchar();} while(‘0‘<=ch&&ch<=‘9‘){an=an*10+(ch-‘0‘);ch=getchar();} return f*an; } int n,m; int b[maxn]; struct saber{ int a,b,wi; }e[maxn]; int f[maxn*2]; int ans,ta1,ta2; bool sa(int x,int y){ return e[x].wi>e[y].wi;} int found(int x){ if(f[x]!=x)f[x]=found(f[x]); return f[x]; } int main(){ n=read();m=read(); for(int i=1;i<=m;i++){ e[i].a=read(); e[i].b=read(); e[i].wi=read(); } for(int i=1;i<=m;i++)b[i]=i; sort(b+1,b+1+m,sa); for(int i=1;i<=2*n;i++)f[i]=i; for(int i=1;i<=m;i++){ int k1=found(e[b[i]].a); int k2=found(e[b[i]].b); if(k1==k2){printf("%d",e[b[i]].wi);return 0;} f[k2]=found(n+e[b[i]].a); f[k1]=found(n+e[b[i]].b); } cout<<"0"; return 0; }
最后水一下这个中二的题目
P1196 银河英雄传说
银河英雄传说
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; const int maxn=30000+99; int read(){ int f=1,an=0; char ch=getchar(); while(!(‘0‘<=ch&&ch<=‘9‘)){if(ch==‘-‘)f=-f;ch=getchar();} while(‘0‘<=ch&&ch<=‘9‘){an=an*10+(ch-‘0‘);ch=getchar();} return an*f; } int T; int f[maxn],sum[maxn],s[maxn]; int found(int x){ if(f[x]!=x){ int k=found(f[x]); s[x]+=s[f[x]]; f[x]=k; } return f[x]; } char c; int a,b; int main(){ T=read();for(int i=1;i<=30000;i++)f[i]=i,sum[i]=1; while(T){T--; cin>>c;a=read();b=read(); int k1,k2; k1=found(a);k2=found(b); if(c==‘M‘){ f[k1]=k2; s[k1]=sum[k2]; sum[k2]+=sum[k1]; } else{ if(k1==k2)cout<<abs(s[a]-s[b])-1<<endl; else cout<<"-1"<<endl;} } return 0; }
就这样过了浑浑噩噩的一天qwq。...
s:芙兰一块吃西瓜啊
标签:cout std blog through print lap http ima gif
原文地址:http://www.cnblogs.com/ck666/p/7464987.html