根据自己的习惯进行了封装
题目参考
给出AC代码:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 10000
struct Line
{
int l, r;
bool operator < (Line b)
{
return l < b.l;
}
};
class CritLink
{
public:
CritLink(int _N):N(_N){};
void Init()
{
for(int i = 0; i < maxn; i++)
mp[i].clear();
memset(vis, 0, sizeof(vis));
memset(dfn, 0, sizeof(dfn));
memset(low, 0, sizeof(low));
memset(flag, 0, sizeof(flag));
dfs_num = cnt = sum = sig = 0;
}
void Input()
{
Init();
int fa, n, d;
int T = N;
while(T--)
{
scanf("%d (%d)", &fa, &n);
for(int i = 0; i < n; i++){
scanf("%d", &d);
mp[fa].push_back(d);
mp[d].push_back(fa);
}
}
}
void Tarjan(int u, int f)
{
fa[u] = f;
vis[u] = 1;
dfn[u] = low[u] = dfs_num++;
int k = 0;
for(int i = 0; i < mp[u].size(); i++)
{
int v = mp[u][i];
if(!vis[v])
{
k++;
Tarjan(v, u);
low[u] = min(low[u], low[v]);
}
else if(f != v)
low[u] = min(low[u], dfn[v]);
}
}
void Get_ans()
{
for(int i = 0; i < N; i++)
if(!vis[i])
Tarjan(i, -1);
for(int i = 0; i < N; i++)
{
int v = fa[i];
if(v != -1 && low[i] > dfn[v])
{
ans[sig].l = min(i, v);
ans[sig++].r = max(i, v);
}
}
printf("%d critical links\n", sig);
int len = sig;
sort(ans, ans + len);
for(int i = 0; i < len; i++)
printf("%d - %d\n", ans[i].l, ans[i].r);
printf("\n");
}
private:
int N;
bool vis[maxn];
int dfn[maxn];
int low[maxn];
int dfs_num;
vector<int> mp[maxn];
int cnt;
bool flag[maxn];
int sum;
Line ans[maxn];
int sig;
int fa[maxn];
};
int main()
{
int n;
while(~scanf("%d", &n))
{
CritLink C(n);
C.Input();
C.Get_ans();
}
return 0;
}