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