zoj 3261

还行的并查集,刚开始find()写的有点问题,不过终于还是过了

先记忆再倒序添加,邻接矩阵存边

#include<iostream>  
#include<cstdio>  
#include<map>  
#include<cstring>  
#include<cmath>  
#include<vector>  
#include<algorithm>  
#include<set>  
#include<string>  
#include<queue>  
#define inf 1<<30  
#define eps 1e-10  
#define zero(a) fabs(a)<eps  
#define Min(a,b) ((a)<(b)?(a):(b))  
#define Max(a,b) ((a)>(b)?(a):(b))  
#define pb(a) push_back(a)  
#define mp(a,b) make_pair(a,b)  
#define mem(a,b) memset(a,b,sizeof(a))  
#define LL long long  
#define lson step<<1  
#define rson step<<1|1  
#define MOD 1000000009  
#define sqr(a) ((a)*(a)) 
#define maxn 50005   
#define M 10005  
#define N 605  
using namespace std; 
int power[M],top[M],pa[M],result[maxn];
struct {
    int f;
    int a,b;
    }query[maxn];
int n,m,q,cnt;
struct {
    int f;
    int b;
    int next;
    }edge[M*2];
void Init(){
    int i;
    for(i=0;i<n;i++){
        pa[i]=i;  top[i]=-1;   
    }
}
int findPa(int a){
    if(pa[a]!=a)
        pa[a]=findPa(pa[a]);
    return pa[a];   
}
void makeSet(int x,int y){
    int px=findPa(x);  int py=findPa(y);
    if(px==py) return ;
    if(power[px]>power[py])      pa[py]=px; 
    else if(power[px]<power[py]) pa[px]=py; 
    else { 
        if(px<py) pa[py]=px;
        else pa[px]=py;
    } 
}
void del(int a,int b){
    int i=top[a];
    while(i!=-1){
        if(edge[i].b==b){ edge[i].f=0; return; }
        i=edge[i].next;
    }
}
int main(){
    int a,b,i,j,t,k,cas=0; char s[15];
    while(~scanf("%d",&n)){
        cas++;
        for(i=0;i<n;i++) scanf("%d",&power[i]);
        Init();
        scanf("%d",&m);
        for(i=0;i<m;i++){
            scanf("%d %d",&a,&b); 
            if(a>b){j=a;a=b;b=j;}
            edge[i].f=1;
            edge[i].b=b;
            edge[i].next = top[a];
            top[a]=i; 
        }  
        scanf("%d",&q);
        for(i=0;i<q;i++){
            scanf("%s",s);
            if(s[0]=='d'){
                scanf("%d %d",&a,&b);
                if(a>b){j=a;a=b;b=j;}
                query[i].f=0;
                query[i].a=a,query[i].b=b;
                del(a,b);
            }else if(s[0]=='q'){
                scanf("%d",&a);   
                query[i].f=1;
                query[i].a=a; 
            }
        }
        for(i=0;i<n;i++){
            t=top[i];            
            while(t!=-1){
                if(edge[t].f==1)makeSet(i,edge[t].b);
                t=edge[t].next;   
            }    
        }
        cnt=0;
        for(i=q-1;i>=0;i--){
            if(query[i].f==1){
                k=findPa(query[i].a);
                if(power[k]>power[query[i].a])result[cnt++]=k;
                else result[cnt++]=-1;
            }else if(query[i].f==0){
                makeSet(query[i].a,query[i].b);
            }
        }
        if(cas>1)printf("\n");
        while(--cnt>=0)printf("%d\n",result[cnt]);
    }
    return 0;    
} 

你可能感兴趣的:(ZOJ,并查集)