UVA796-Critical Links

来源:互联网 发布:校园网网络拓扑图设计 编辑:程序博客网 时间:2024/05/17 20:34



题意:给出n个点,m条无向边,按顺序输出桥


#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <algorithm>#include <cmath>#include <vector>#include <map>#include <set>#include <queue>#include <stack>#include <functional>#include <climits>using namespace std;#define LL long longconst int INF=0x3f3f3f3f;const int N=1e4+10;struct Edge{    int v,flag,next;}edge[N*20];struct bridge{    int u,v;}ans[N];int s[N],tot,cnt;int n,m;int dfn[N],low[N],dep;bool vis[N];bool cmp(bridge a,bridge b){    if(a.u!=b.u) return a.u<b.u;    else return a.v<b.v;}void AddEdge(int u,int v){    for(int i=s[u]; ~i; i=edge[i].next)    {        if(edge[i].v==v)        {            edge[i].flag++;            return ;        }    }    edge[tot].v=v;    edge[tot].next=s[u];    edge[tot].flag=0;    s[u]=tot++;}void tarjan(int u,int pre){    vis[u]=true;    dfn[u]=low[u]=++dep;    for(int i=s[u]; ~i; i=edge[i].next)    {        int v=edge[i].v;        if(v==pre) continue;        if(!vis[v])        {            tarjan(v,u);            low[u]=min(low[u],low[v]);        }        else low[u]=min(low[u],dfn[v]);        if((low[v]>dfn[u])&&!edge[i].flag)        {            ans[cnt].u=u;            ans[cnt].v=v;            if(u>v) swap(ans[cnt].u,ans[cnt].v);            cnt++;        }    }}int main(){    while(~scanf("%d",&n))    {        memset(s,-1,sizeof s);        tot=cnt=0;        for(int i=1; i<=n; i++)        {            int u,v,k;            scanf("%d (%d)",&u,&k);            u++;            for(int j=1; j<=k; j++)            {                scanf("%d",&v);                v++;                AddEdge(u,v);            }        }        memset(vis,0,sizeof(vis));        dep=0;        for (int i=1;i<=n;i++)            if(!vis[i]) tarjan(i,i);        sort(ans,ans+cnt,cmp);        printf("%d critical links\n",cnt);        for(int i=0; i<cnt; i++)            printf("%d - %d\n",ans[i].u-1,ans[i].v-1);        printf("\n");    }    return 0;}

0 0
原创粉丝点击