UVA 796 Critical Links(Tarjan求割边)

来源:互联网 发布:xquartz2.7.5 mac 编辑:程序博客网 时间:2024/05/17 08:18

套模板。不过用map < int,int > 错了,换成set < pair < int,int > > 结果就对了。

#include <bits/stdc++.h>using namespace std;const int MAXN = 10010;const int MAXM = 100100;struct Edge{    int to,next;};Edge edge[MAXM];int Low[MAXN],DFN[MAXN];int head[MAXN];int tot,Index,cnt;set<pair<int,int>> res;void init(){    memset(head,-1,sizeof(head));    res.clear();    tot = 0;}void addedge(int u, int v){    edge[tot].to = v;    edge[tot].next = head[u];    head[u] = tot++;}void Tarjan(int u, int pre){    DFN[u] = Low[u] = ++Index;    for(int i = head[u]; i != -1; i = edge[i].next)    {        int v = edge[i].to;        if(!DFN[v])        {            Tarjan(v,u);            Low[u] = min(Low[u],Low[v]);            if(Low[v] > DFN[u])            {                ++cnt;                res.insert(make_pair(min(u,v),max(u,v)));            }        }        else if(v != pre)            Low[u] = min(Low[u],DFN[v]);    }}void solve(int n){    memset(Low,0,sizeof(Low));    memset(DFN,0,sizeof(DFN));    Index = cnt = 0;    for(int i = 1; i <= n; ++i)        if(!DFN[i])            Tarjan(i,i);    printf("%d critical links\n",cnt);    for(pair<int,int> x : res)        printf("%d - %d\n",x.first-1,x.second-1);    printf("\n");}int main(){    int n;    while(~scanf("%d",&n))    {        init();        int u,v,k;        for(int i = 0; i < n; ++i)        {            scanf("%d (%d)",&u,&k);            u++;            while(k--)            {                scanf("%d",&v);                v++;                addedge(u,v);                addedge(v,u);            }        }        solve(n);    }    return 0;}