UVA - 796
/** 题意:给出一个图,然后看此图的存在的桥,并且输出是哪一个, 做法:Tarjan(不存在重边) **/ #include<iostream> #include<stdio.h> #include<string.h> #include<cmath> #include<algorithm> #include<vector> using namespace std; #define maxn 11000 #define maxm 100010 #define INF 0x3f3f3f3f struct Edge { int to; int next; bool cut; } edge[maxm]; int head[maxn],tot; int Low[maxn],DFN[maxn],Stack[maxn]; int Index,top; bool Instack[maxn]; bool cut[maxn]; int add_block[maxn]; int bridge; void addedge(int u,int v) { edge[tot].to = v; edge[tot].next = head[u]; edge[tot].cut = false; head[u] = tot++; } void Tarjan(int u,int pre) { int v; Low[u] = DFN[u] = ++Index; Stack[top++] = u; Instack[u] = true; int son = 0; for(int i=head[u]; i != -1; i = edge[i].next) { v = edge[i].to; if(v == pre) { continue; } if(!DFN[v]) { son++; Tarjan(v,u); if(Low[u] > Low[v]) Low[u] = Low[v]; ///桥 if(Low[v]>DFN[u]) { bridge++; edge[i].cut = true; edge[i^1].cut = true; } ///割点 if(u!=pre && Low[v] >= DFN[u]) { cut[u] = true; add_block[u] ++; } } else if(Low[u] > DFN[v]) { Low[u] = DFN[v]; } } if(u == pre && son>1) cut[u] = true; if(u == pre)add_block[u] = son -1; Instack[u] = false; top--; } void solve(int N) { memset(DFN,0,sizeof(DFN)); memset(Instack,false,sizeof(Instack)); memset(add_block,0,sizeof(add_block)); memset(cut,false,sizeof(cut)); Index = top = 0; bridge = 0; for(int i=1; i<=N; i++) { if(!DFN[i]) Tarjan(i,i); } printf("%d critical links\n",bridge); vector<pair <int,int> > ans; for(int u = 1;u<=N;u++) { for(int i=head[u];i != -1;i = edge[i].next) { if(edge[i].cut && edge[i].to > u) { ans.push_back(make_pair(u,edge[i].to)); } } } sort(ans.begin(),ans.end()); for(int i=0;i<ans.size();i++) { printf("%d - %d\n",ans[i].first - 1,ans[i].second -1); } printf("\n"); } void Init() { tot = 0; memset(head,-1,sizeof(head)); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int n; while(~scanf("%d",&n)) { int u,Q,v; Init(); for(int i=1;i<=n;i++) { scanf("%d (%d)",&u,&Q); u++; while(Q--) { scanf("%d",&v); v++; if(v<=u) continue; addedge(u,v); addedge(v,u); } } solve(n); } return 0; }