poj Network 强连通 + LCA + 桥

转载 2013年12月01日 22:32:33
题意;给你一个无向连通图,每次加一条边后,问图中桥的数目
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>

using namespace std;

const int M = 400005;

struct node {

    int to;
    int next;

}num[M];

int ins[M];
int dfn[M];
int low[M];
int head[M];
int isqiao[M];
int Set[M];
int index;
int ans;
int T, n, m, e;

void add(int a, int b) {

    num[e].to = b;
    num[e].next = head[a];
    head[a] = e++;
}

int Find(int x) {

    return x == Set[x] ? x : Set[x] = Find(Set[x]);
}

void Union(int x, int y) {

    x = Find(x);
    Set[y] = x;
}

void Tanjian(int u ,int p) {  //缩点,

    int v;
    Set[u] = u;
    dfn[u] = low[u] = index++;
    ins[u] = 1;

      for(int k = head[u]; k != -1; k = num[k].next) {

        v = num[k].to;
         if(ins[v] == 1 && v != p) {  //防止重边

            low[u] = min(low[u], dfn[v]);
        }

        if(!dfn[v]) {

            Tanjian(v, u);
            Union(u, v);  //使用并查集构建LCA
            low[u] = min(low[u], low[v]);
            if(low[v] > dfn[u]) {   //判断桥的条件,

                isqiao[v] = 1;
                ans++;
            }
        }

    }
    ins[u] = 2;

}

void lca(int x, int y) {


    if(dfn[x] < dfn[y]) swap(x, y);
    while(dfn[x] > dfn[y]) {

        if(isqiao[x]) {  //找x和最近根间所有的桥,把他们消去;

            ans--;
            isqiao[x] = 0;
        }
        x = Set[x];
    }
    while(x != y) {  //找到y和最近根间的所有桥, 把他们消去;

        if(isqiao[y]) {

            ans--;
            isqiao[y] = 0;
        }
        y = Set[y];
    }
}


int main()
{
  int a, b, q = 1;

  while (scanf("%d%d", &n, &m) != EOF ) {

    if(n == 0 && m == 0)
        break;
    e = 0;
    ans = 0;
    index = 1;
    memset(head, -1, sizeof(head));
    memset(isqiao, 0, sizeof(isqiao));
    memset(dfn, 0, sizeof(dfn));
  //  memset(low, 0, sizeof(low));
    memset(ins, 0, sizeof(ins));
    for(int i = 0; i < m; i++) {

        scanf("%d%d", &a, &b);
           add(a, b);
           add(b, a);
    }

        Tanjian(1, -1);
    printf("Case %d:\n", q++);
  scanf("%d", &T);
  for(int i = 0; i < T; i++) {

    scanf("%d%d", &a, &b);
    lca(a, b);
    printf("%d\n", ans);
  }
  printf("\n");

  }
    return 0;
}

poj 3694 Network(桥+lca)

给定一个无向无环图,保证连通,求每加入一条给定的边图中还剩下多少桥。 双联通缩点重新建图后,再用lca在线算法解。 lca算法参考斌神http://www.cnblogs.com/kuangbin...
  • u014569598
  • u014569598
  • 2014年12月28日 11:34
  • 609

强连通性Tarjan算法和LCA

其实tarjan算法提出的思想就是DFS深度优先遍历,在遍历的过程中记录某些变量的值,来解决相关问题,下面两个经典的问题都能通过tarjan的思想去解决。在此表达对Robert Tarjan的崇高敬意...
  • selous
  • selous
  • 2017年03月09日 22:21
  • 343

强连通分量和桥和割点——Tarjanの板子

还有两天就NOIP了。。ATP稍微有点儿。。紧张。。。。
  • FromATP
  • FromATP
  • 2016年11月16日 16:25
  • 408

LCA+poj1986

Language: Default Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Tot...
  • u010660276
  • u010660276
  • 2014年08月09日 21:03
  • 442

【POJ 3694】 Network(割边<桥>+LCA)

【POJ 3694】 Network(割边+LCA) Network Time Limit: 5000MS   Memory Limit: 65536K ...
  • ChallengerRumble
  • ChallengerRumble
  • 2016年02月25日 14:19
  • 1340

poj 3694 Network(双连通求桥+lca)

Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5874   Accept...
  • WEYuLi
  • WEYuLi
  • 2013年08月21日 15:07
  • 699

poj 3694 Network (找桥,LCA)

题意: 给出一张图,Q个询问,每个询问都是在前面询问的基础上,每个询问连一条边,问现在还有几个桥。 题解: 跑一边Tarjan,同时记录桥、父亲的信息,然后对于每个询问找LCA,途经桥,那么桥的...
  • My_ACM_Dream
  • My_ACM_Dream
  • 2015年04月01日 15:56
  • 295

POJ1330(LCA离线和在线)

Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28271 ...
  • qq_33183401
  • qq_33183401
  • 2017年04月18日 23:03
  • 412

POJ1986-LCA问题的在线离线两种算法

在线算法:dfs+rmq /* 这个版本的在线算法比自创的好看简洁多了,可以当模板,效率不高在于算法其本身的原因; 据说离线算法要快不少。 */ #include #include #inc...
  • yihuikang
  • yihuikang
  • 2012年07月20日 20:30
  • 3948

HDU - 2460 Network(桥+LCA)

题目大意:给出一张图,现在要往这张图上加边,问加完边后,这张图还有多少条桥解题思路:求出连通分量,压缩成点,用桥连接,形成了棵树 每次添加边时,就找一下是否在同一个强连通分量内,如果在同一个强连通分...
  • L123012013048
  • L123012013048
  • 2015年08月14日 01:11
  • 666
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj Network 强连通 + LCA + 桥
举报原因:
原因补充:

(最多只允许输入30个字)