zoukankan      html  css  js  c++  java
  • 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:
    ",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 }
    View Code
  • 相关阅读:
    python实现从生成器中取固定角标的元素
    python-高阶函数
    git学习手册
    python批量进行文件修改操作
    python第一站
    LoadRunner,一个简单的例子
    python3中urllib2的问题
    gitlab 随笔
    sed 删除文本
    sed 修改文本
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3546617.html
Copyright © 2011-2022 走看看