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: ",case1); 99 while(t--) 100 { 101 scanf("%d%d",&x,&y); 102 lca(x,y); 103 printf("%d ",num); 104 } 105 } 106 return 0; 107 }