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();
             }
         }
     }
     ;
 }
04-24 15:34