1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include <bits/stdc++.h> #define F(n) Fi(i,n) #define Fi(i,n) Fl(i,0,n) #define Fl(i,l,n) for(int i=l;i<n;i++) using namespace std; const int N = 501, M = 500001; queue<int> DIE[N*N]; int CUT[N*N]; set<int> G[N]; bool wed[N]; struct Query{ bool q; int a,b; }D[M]; inline int getEid(int a,int b,int n){ if(a>b)swap(a,b); return a*n+b; } inline int getTime(int x){ return DIE[x].empty()?M:DIE[x].front(); } int DFS(int now,int no, int end, int n){ wed[now] = true; if(now == end){ return no == -1?0:getEid(now,no,n); } for(int p:G[now]){ if(p!=no){ assert(!wed[p]); int tmp = DFS(p,now,end,n); if(tmp!=-1){ return (no == -1 || getTime(tmp) < getTime(getEid(now,no,n)))?tmp:getEid(now,no,n); }} } return -1; } void link(int a,int b){ G[a].insert(b); G[b].insert(a); } void cut(int a, int b,int n){ int tmp = getEid(a,b,n); if(!DIE[tmp].empty())DIE[tmp].pop(); G[a].erase(b); G[b].erase(a); } main(){ ios_base::sync_with_stdio(false); cin.tie(0); int t,n,m,q,a,b; cin>>t; while(t--){ cin>>n>>m>>q; memset(CUT,0,sizeof(CUT)); fill(DIE,DIE+n*2,queue<int>()); F(n)G[i].clear(); F(m){ cin>>D[i].a>>D[i].b; D[i].q = true; } char c; F(q){ cin>>c>>D[i+m].a>>D[i+m].b; D[i+m].q = c=='N'; if(!D[i+m].q){ DIE[getEid(D[i+m].a,D[i+m].b,n)].push(i); } } int ans = n; F(m+q){ memset(wed,0,sizeof(wed)); if(D[i].q){ int tmp = DFS(D[i].a, -1, D[i].b, n); if(tmp != -1){ int now = getEid(D[i].a,D[i].b,n); if(getTime(now) > getTime(tmp)){ CUT[tmp]++; cut(tmp/n,tmp%n, n); link(D[i].a,D[i].b); }else{ CUT[now]++; if(!DIE[now].empty())DIE[now].pop(); } }else{ link(D[i].a,D[i].b); ans--; } }else{ int tmp = getEid(D[i].a,D[i].b,n); if(CUT[tmp]){ CUT[tmp]--; }else{ cut(D[i].a,D[i].b, n); if(DFS(D[i].a, -1, D[i].b, n)==-1)ans++; } } if(i>=m)cout<<ans<<'\n'; } } }
|