Analysis: For this kind of cut-edge operation, we can usually read it first, and then convert it offline to reverse the plus edge
#include <stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespaceStd;typedef pair<int,int>PII;Const intn=1e4+5;p II P[n<<1];intv[n],fa[n],n,m,q;BOOLvis[n<<1];structask{intOp,id,ans;} Ask[n*5];intFindintx) { returnx==fa[x]?x:fa[x]=find (Fa[x]);}voidUnion (intXinty) {x=find (x), y=find (y); if(x==y)return; if(v[x]>v[y]| | (V[x]==v[y]&&x<y)) fa[y]=x; Elsefa[x]=y;}intMain () {BOOLflag=1; while(~SCANF ("%d",&N)) { if(flag) flag=0; Elseprintf"\ n"); for(intI=0; i<n;++i) {scanf ("%d", &v[i]), fa[i]=i; } memset (Vis,0,sizeof(VIS)); scanf ("%d",&m); for(intI=1; i<=m;++i) {scanf ("%d%d",&p[i].first,&P[i].second); if(p[i].first>p[i].second) Swap (P[i].first,p[i].second); } sort (P+1, p+1+m); scanf ("%d",&q); for(intI=1; i<=q;++i) { Chars[Ten]; intu,v; scanf ("%s%d",s,&T); if(s[0]=='Q') {Ask[i].op=1; Ask[i].id=u; } Else{Ask[i].op=2; scanf ("%d",&v); if(u>v) swap (u,v); Ask[i].id=lower_bound (p+1, p+1+m,make_pair (u,v))-p; Vis[ask[i].id]=1; } } for(intI=1; i<=m;++i) { if(Vis[i])Continue; Union (P[i].first,p[i].second); } for(intI=q;i>0;--i) { if(ask[i].op==1) {Ask[i].ans=find (ask[i].id); if(V[ask[i].ans]==v[ask[i].id]) ask[i].ans=-1; } ElseUnion (P[ask[i].id].first,p[ask[i].id].second); } for(intI=1; i<=q;++i)if(ask[i].op==1) printf ("%d\n", Ask[i].ans); } return 0;}
View Code
ZOJ3261 Connections in Galaxy War and check set