码迷,mamicode.com
首页 > 其他好文 > 详细

并查集题目从入门到入土

时间:2017-09-01 21:21:33      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:cout   std   blog   through   print   lap   http   ima   gif   

2017-09-01

并查集一个神奇的算法

今天我们的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;
}
P1196 银河英雄传说

就这样过了浑浑噩噩的一天qwq。...

s:芙兰一块吃西瓜啊

技术分享

并查集题目从入门到入土

标签:cout   std   blog   through   print   lap   http   ima   gif   

原文地址:http://www.cnblogs.com/ck666/p/7464987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!