poj 3694 Network

http://poj.org/problem?id=3694

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #define maxn 201105
  5 using namespace std;
  6 
  7 int e,low[maxn],dfn[maxn],dfs_clock,f[maxn],num,b[maxn],n,m,head[maxn];
  8 struct node
  9 {
 10     int v,next;
 11 }p[maxn*2];
 12 int vis[maxn];
 13 
 14 void add(int u,int v)
 15 {
 16     p[e].v=v;
 17     p[e].next=head[u];
 18     head[u]=e++;
 19     p[e].v=u;
 20     p[e].next=head[v];
 21     head[v]=e++;
 22 }
 23 
 24 void tarjan(int u)
 25 {
 26     vis[u]=1;
 27     dfn[u]=low[u]=++dfs_clock;
 28     
 29     for(int i=head[u]; i!=-1; i=p[i].next)
 30     {
 31         int v=p[i].v;
 32         if(!vis[v])
 33         {
 34             f[v]=u;
 35             tarjan(v);
 36             low[u]=min(low[u],low[v]);
 37             if(low[v]>dfn[u])
 38             {
 39                 num++;
 40                 b[v]=1;
 41             }
 42         }
 43         else if(vis[v]==1&&v!=f[u]) low[u]=min(low[u],dfn[v]);
 44     }
 45     vis[u]=2;
 46 }
 47 
 48 void init()
 49 {
 50     memset(vis,0,sizeof(vis));
 51     memset(dfn,0,sizeof(dfn));
 52     memset(b,0,sizeof(b));
 53     memset(head,-1,sizeof(head));
 54     e=0,num=0,dfs_clock=0;
 55     for(int i=1; i<=n; i++) f[i]=i;
 56 }
 57 
 58 void lca(int u,int v)
 59 {
 60     if(dfn[u]<dfn[v]) swap(u,v);
 61     while(dfn[u]>dfn[v])
 62     {
 63         if(b[u]) 
 64         {
 65             num--;
 66             b[u]=0;
 67         }
 68         u=f[u];
 69     }
 70     while(u!=v)
 71     {
 72         if(b[u]) 
 73         {num--;b[u]=0;}
 74         if(b[v]) {num--;b[v]=0;}
 75         u=f[u];
 76         v=f[v];
 77     }
 78 }
 79 
 80 int main()
 81 {
 82     int t;
 83     int case1=0;
 84     while(scanf("%d%d",&n,&m))
 85     {
 86         if(n==0&&m==0) break;
 87         init();
 88         int u,v;
 89         for(int i=0; i<m; i++)
 90         {
 91             scanf("%d%d",&u,&v);
 92             add(u,v);
 93         }
 94         tarjan(1);
 95         scanf("%d",&t);
 96         int x,y;
 97         case1++;
 98         printf("Case %d:\n",case1);
 99         while(t--)
100         {
101             scanf("%d%d",&x,&y);
102             lca(x,y);
103             printf("%d\n",num);
104         }
105     }
106     return 0;
107 }
View Code

 

posted @ 2014-02-12 21:13  null1019  阅读(124)  评论(0编辑  收藏  举报