• poj3694Network(tarjan+lca)


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

    用tarjan算出桥,用lca算出公共祖先 把路上的边更新掉 原来的桥变为不是桥 看一解题报告感觉有一部分是不用加的 不知道是不是数据水 没加交上也A了。。

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stdlib.h>
      6 using namespace std;
      7 #define N 1000010
      8 #define M 2000010
      9 struct node
     10 {
     11     int u,v,next;
     12 }edge[M*2];
     13 int head[N],t,dfn[N],iscut[N],fa[N],low[N],num,dc;
     14 void init()
     15 {
     16     t = 0;
     17     memset(head,-1,sizeof(head));
     18     memset(dfn,0,sizeof(dfn));
     19     memset(low,0,sizeof(low));
     20     fa[1] = 0;
     21     num=0;
     22     dc=0;
     23 }
     24 void add(int u,int v)
     25 {
     26     edge[t].u = u;
     27     edge[t].v = v;
     28     edge[t].next = head[u];
     29     head[u] = t++;
     30     edge[t].u = v;
     31     edge[t].v = u;
     32     edge[t].next = head[v];
     33     head[v] = t++;
     34 }
     35 void tarjan(int u,int faa)
     36 {
     37     int i,flag=1;
     38     dfn[u] = low[u] = ++dc;
     39     for(i = head[u] ; i != -1 ; i = edge[i].next)
     40     {
     41         int v = edge[i].v;
     42         if(flag&&faa==v)
     43         {
     44             flag = 0;
     45             continue;
     46         }
     47         if(!dfn[v])
     48         {
     49             fa[v] = u;
     50             tarjan(v,u);
     51             low[u] = min(low[v],low[u]);
     52             if(low[v]>dfn[u])
     53             {
     54                 num++;
     55                 iscut[v] = 1;
     56             }
     57         }
     58         else
     59         low[u] = min(dfn[v],low[u]);
     60     }
     61 }
     62 void lca(int u,int v)
     63 {
     64     int t;
     65     if(dfn[u]<dfn[v])
     66     {t = u;u = v;v = t;}
     67     while(dfn[u]>dfn[v])
     68     {
     69         if(iscut[u])
     70         {
     71             iscut[u] = 0;
     72             num--;
     73         }
     74         u = fa[u];
     75     }
     76     while(u!=v)
     77     {
     78         if(iscut[v])
     79         {
     80             iscut[v] = 0;
     81             num--;
     82         }
     83         /*if(iscut[u])
     84         {
     85             iscut[u] = 0;
     86             num--;
     87         }*/
     88         v = fa[v];u = fa[u];
     89     }
     90 }
     91 int main()
     92 {
     93     int n,m,q,a,b,kk=0;
     94     while(cin>>n>>m)
     95     {
     96         kk++;
     97         if(n==0&&m==0)
     98         break;
     99         init();
    100         while(m--)
    101         {
    102            cin>>a>>b;
    103            add(a,b);
    104         }
    105         tarjan(1,0);
    106         printf("Case %d:
    ",kk);
    107         cin>>q;
    108         while(q--)
    109         {
    110             cin>>a>>b;
    111             lca(a,b);
    112             cout<<num<<endl;
    113         }
    114         puts("");
    115     }
    116     return 0;
    117 }
    View Code
  • 相关阅读:
    Python学习笔记(十一)
    Python学习笔记(十)
    Python学习笔记(九)
    Fatal error in launcher:Unable to create process using '"'
    通过xrdp服务实现windows远程桌面连接树莓派
    Python学习笔记(七)
    Python 杂集
    Python入门小练习
    Python标准库
    [Chrome](CSS) 解决Chrome font-size 小于 12px 无效
  • 原文地址:https://www.cnblogs.com/shangyu/p/3141448.html
Copyright © 2020-2023  润新知