C - Critical Links - uva 796(求桥)

题意:有一些网络通过一些线路连接,求关键的连接,也就是桥,如果删除这个链接那么会产生两个子树

分析:注意一下图不是连通图即可

*******************************************************************

#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
using namespace std;

const int MAXN = 1005;

///构建邻接表
struct Edge{int v, next;}e[MAXN*MAXN];
int Head[MAXN], cnt;
void AddEdge(int u, int v)
{
    e[cnt].v = v;
    e[cnt].next = Head[u];
    Head[u] = cnt++;
}

///记录桥
struct Bridge{int u, v;}bri[MAXN];
int bnt;
bool cmp(Bridge n1, Bridge n2)
{
    if(n1.u != n2.u)
        return n1.u < n2.u;
    return n1.v < n2.v;
}

int f[MAXN];
int Dfn[MAXN], Low[MAXN], Index;

void InIt(int N)
{
    cnt = bnt = Index = 0;
    for(int i=0; i<=N; i++)
    {
        Head[i] = -1;
        Dfn[i] = false;
    }
}
void Tarjan(int u, int father)
{
    f[u] = father;
    Low[u] = Dfn[u] = ++Index;

for(int j=Head[u]; j!=-1; j=e[j].next)
    {
        int v = e[j].v;
        if( !Dfn[v] )
        {
            Tarjan(v, u);
            Low[u] = min(Low[u], Low[v]);
        }
        else if( v != father )
            Low[u] = min(Low[u], Dfn[v]);
    }
}

int main()
{
    int N;

while(scanf("%d", &N) != EOF)
    {
        int i, u, v, M;

InIt(N);

for(i=0; i<N; i++)
        {
            scanf("%d (%d)", &u, &M);

while(M--)
            {
                scanf("%d", &v);
                AddEdge(u, v);
            }
        }

for(i=0; i<N; i++)
        {
            if( !Dfn[i] )
                Tarjan(i, i);
        }

for(i=0; i<N; i++)
        {
            int u = f[i];
            if( Low[i] > Dfn[u] )
            {
                bri[bnt].u = min(u, i);
                bri[bnt++].v = max(u, i);
            }
        }

sort(bri, bri+bnt, cmp);

printf("%d critical links\n", bnt);

for(i=0; i<bnt; i++)
            printf("%d - %d\n", bri[i].u, bri[i].v);
        printf("\n");
    }

return 0;
}

时间: 2024-10-10 05:10:14

C - Critical Links - uva 796(求桥)的相关文章

Uva 796 求桥

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737 /*** Uva 796 求桥 题目要求:输出题目中所有的桥,按其所连接的点从小到大的顺序输出 解题思路:tarjan算法,所有树枝边都是桥(dfn[u]<low[v]),利用vector存储一下就可以了 */ #include <stdio.h> #include &

UVA796 - Critical Links(Tarjan求桥)

In a computer network a link L, which interconnects two servers, is considered critical if there are atleast two servers A and B such that all network interconnection paths between A and B pass through L.Removing a critical link generates two disjoin

Light OJ 1026 - Critical Links (图论-求割边, 桥)

题目大意:双向联通图, 现在求减少任意一边使图的联通性改变,按照起点从小到大列出所有这样的边 解题思路:双向边模版题 tarjan算法 代码如下: #include<bits/stdc++.h> using namespace std; const int N = 100003; vector<int>vec[N]; pair<int, int>edge[N]; int dfn[N], low[N]; int res, ans; void tarjan(int u, i

UVA 796 - Critical Links【求桥】

link:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737 题意: 求桥的数目及边,要求输出边的点的次序由小到大 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include

UVA 796 Critical Links(无向图求桥)

题目来源: UVa Online Judgehttps://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737 求一个连通图中必不可少的路径: #include<stdio.h> #include<algorithm> #include<vector> #include<string.h> #define

UVA 796 - Critical Links (求桥按序输出)

tanjar求图中的桥,然后排序输出. 代码: #include<iostream> #include<cstdio> #include<string> #include<cmath> #include<queue> #include<stack> #include<map> #include<cstring> #include<algorithm> #define rep(i,a,b) for(i

UVA 796 Critical Links —— (求割边(桥))

和求割点类似,只要把>=改成>即可.这里想解释一下的是,无向图没有重边,怎么可以使得low[v]=dfn[u]呢?只要它们之间再来一个点即可. 总感觉图论要很仔细地想啊- -一不小心就弄混了.. 另外从这题发现,代码还是写成模块化比较好,比如solve一个函数,init一个函数等等,这样可以避免很多东西忘记写,比方说dfn或者G的清空等等.. 代码如下: 1 #include <stdio.h> 2 #include <stack> 3 #include <alg

Light OJ 1026 Critical Links 求桥

题目 Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example, If S = [1,2,3], a solution is: [ [3], [1], [2], [1,2,3]

Light OJ - 1026 - Critical Links(图论-Tarjan算法求无向图的桥数) - 带详细注释

 原题链接   无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 也可以先用Tajan()进行dfs算出所有点 的low和dfn值,并记录dfs过程中每个 点的父节点:然后再把所有点遍历一遍, 看其low和dfn,满足dfn[ fa ]<low[ i ](0<i<=n, i 的 father为fa) -- 则桥为fa-i. 找桥的时候,要注意看有没有重边:有重边,则不是桥. 另外,本题的题意及测试样例中没有重边,所以不用考虑重边. 带详细注释的题解: #include<s