当前位置: 代码迷 >> 综合 >> UVA 796 - Critical Links (求桥)
  详细解决方案

UVA 796 - Critical Links (求桥)

热度:19   发布时间:2023-12-06 19:48:25.0

无向图求桥:


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
const int MAXN = 10010;
const int MAXM = 100010;
struct Edge
{int to, nxt;bool cut;
}edge[MAXM];
int head[MAXN], tol;
int Low[MAXN], DFN[MAXN];
int Index;
bool cut[MAXN];
int add_block[MAXN];
int bridge;
void init()
{tol = 0;memset(head, -1, sizeof(head));
}
void addedge(int u, int v)
{edge[tol].to = v;edge[tol].nxt = head[u];edge[tol].cut = false;head[u] = tol++;
}
void Tarjan(int u, int pre)
{int v;Low[u] = DFN[u] = ++Index;int son = 0;for(int i = head[u]; i != -1; i = edge[i].nxt){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]++;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;
}
void solve(int N)
{memset(DFN, 0, sizeof(DFN));memset(add_block, 0, sizeof(add_block));memset(cut, false, sizeof(cut));bridge = Index = 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].nxt)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");
}
int main()
{int n;while(scanf("%d", &n) == 1){init();for(int i = 1; i <= n; i++){int u, v, k;scanf("%d (%d)", &u, &k);u++;while(k--){scanf("%d", &v);v++;if(v <= u)continue;addedge(u, v);addedge(v, u);}}solve(n);}return 0;
}


  相关解决方案