http://www.lydsy.com/JudgeOnline/problem.php?id=3562
//Accepted 6020 kb 1012 ms //由于题目的特殊要求:然而,令科学家们大为惊异的是,SHTSC 在变化过程中始终保持着一种特殊的性质: //即不存在这样的原子序列 a1,a2,...,an(n>3)满足 a1 与 a2、a2 与 //a3、......、an-1 与 an 以及 an 与 a1 都通过化学键相连,但它们之间却没有其他化学键相连的情况。 //所以有如下结论: //记所求答案为ans //对于A x y,判断是否存在另外的一个点z使x,z有边,y,z有边 //如果存在z,则操作以后ans不变,否则ans+=1; //对于D x y,判断是否存在另外的一个点z使x,z有边,y,z有边 //如果存在z,则操作以后ans不变,否则ans-=1; #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <cmath> #include <algorithm> using namespace std; #define ll long long ; ; struct node { int v,u; node() { } node(int u,int v):u(u),v(v) { } }p[imax_m]; int head[imax_n],next[imax_m]; int e; int vis[imax_n]; int ans; int Q; int n,m; void init() { memset(head,-,sizeof(head)); memset(next,-,sizeof(next)); e=; } void addEdge(int u,int v) { p[e]=node(u,v); next[e]=head[u]; head[u]=e++; } void deleteEdge(int u,int v) { ,i; ;i=next[i]) { if (p[i].v==v) break; pre=i; } ) { //head[u]=next[next[i]]; head[u]=next[i]; } else { //next[pre]=next[next[i]]; next[pre]=next[i]; } } void dfs(int u) { vis[u]=; ;i=next[i]) { int v=p[i].v; if (!vis[v]) dfs(v); } } int countTheNumberOfGraph() { memset(vis,,sizeof(vis)); ; ;i<=n;i++) { if (!vis[i]) { dfs(i); ans++; } } return ans; } /* bool find(int x,int y) { int flag=0; for (int i=1;i<=n;i++) { if (i==x) continue; if (i==y) continue; flag=0; for (int j=head[i];j+1;j=next[j]) { if (p[j].v==x) flag++; if (p[j].v==y) flag++; if (flag==2) return 1; } } return 0; } */ int mark[imax_n]; bool find(int x,int y) { memset(mark,,sizeof(mark)); ;i=next[i]) { if (p[i].v!=y) mark[p[i].v]++; } ;i=next[i]) { if (p[i].v!=x) mark[p[i].v]++; } ;i<=n;i++) { //printf("mark[%d]=%d\n",i,mark[i]); ) ; } ; } void operatorA(int x,int y) { ) { //printf("A %d %d ans--\n",x,y); ans--; } addEdge(x,y); addEdge(y,x); } void operatorD(int x,int y) { ) { //printf("D %d %d ans++\n",x,y); ans++; } deleteEdge(x,y); deleteEdge(y,x); } void operatorQ() { printf("%d\n",ans); } ]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); ) { int x,y; init(); ;i<m;i++) { scanf("%d%d",&x,&y); addEdge(x,y); addEdge(y,x); } ans=countTheNumberOfGraph(); scanf("%d",&Q); ;i<Q;i++) { scanf("%s",s); ]=='A') { scanf("%d%d",&x,&y); operatorA(x,y); } ]=='D') { scanf("%d%d",&x,&y); operatorD(x,y); } ]=='Q') { operatorQ(); } } } ; }