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

 

你可能感兴趣的:(NetWork)