zoj 3261

来源:互联网 发布:广州淘宝开店培训班 编辑:程序博客网 时间:2024/06/16 19:28

还行的并查集,刚开始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;    }