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;
}

相关文章推荐

poj3694 Network 无向图tarjan求桥+LCA

Language: Default Network Time Limit: 5000MS   Memory Limit: 65536K Total Submis...

poj3417Network(LCA+dfs)

题意:给一个树,然后又在树上加了好多的边,现在问你删除一条原先的边和新加的边的一条,有多少中方法使得树不连通思路:对于新加的一条边来说,肯定会与之前的树形成一个环,而此时环内的所有边删除并且新加的这条...

POJ 3694 Network 割边+LCA

这道题跟3177意思差不多,不过最后问的不一样,说是加入某条边后,问图内剩余的桥有多少。 这题的大概思路就是,先求割边并标记,然后缩点,形成一棵树,然后把这颗树上各个结点的父结点用dfs求出来,再然...

POJ 3417 Network (LCA + DP)

题意:先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂。 我们知道,这m条边连上后这颗树必将成环,假设新边为(...

POJ3694 Network 割边+LCA

题目链接: Poj3694 题意: 给出一个N(1 ≤ N ≤ 100,000)个点 和 M(N - 1 ≤ M ≤ 200,000)的连通图. 有Q ( 1 ≤ Q ≤ ...

POJ 3694 Network 割边+LCA

A network administrator manages a large network. The network consists of N computers and M links bet...

poj 3694 Network(tarjan + LCA)

http://poj.org/problem?id=3694 题意:对于一个无向连通图,问加入某条边后,图中有桥的数目。 思路: 根据tarjan算法求出初始图的桥的数目,并用数组bridge标记桥的...

POJ_3694 Network Tarjin + LCA + 并查集

http://poj.org/problem?id=3694 题意:给定一个有N个点,M条边的无向图(图原本连通),N 思路:先对原无向图缩点,初始时候,桥的条数为:cnt -1 , 其中cnt为...

poj3417 Network 离线LCA + 树形dp

Language: Default Network Time Limit: 2000MS   Memory Limit: 65536K Total Submis...

POJ 3417 Network LCA

POJ 3417 Network LCA
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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