tarjan求割边模板题
注意处理重边,有重边必然不是桥。
图一开始不一定连通
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1010
#define INF 0x3f3f3f
int guards[MAXN][MAXN];
int low[MAXN], dfn[MAXN], dfs_clock;
vector<int> G[MAXN];
int father[MAXN];
int ans;
bool flag = false;
void tarjan(int u, int fa) {
father[u] = fa;
low[u] = dfn[u] = ++dfs_clock;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (!dfn[v]) {
tarjan(v, u);
low[u] = min(low[u], low[v]);
if (low[v] > dfn[u]) {
flag = true;
ans = min(ans, guards[u][v]);
}
} else if (dfn[v] < dfn[u] && v != fa) {
low[u] = min(low[u], dfn[v]);
}
}
}
void init()
{
flag = false;
dfs_clock = 0;
memset(guards, 0, sizeof(guards));
for(int i = 0; i < MAXN; ++i)
{
G[i] = vector<int>();
dfn[i] = 0;
low[i] = 0;
}
}
int main()
{
int N, M;
while(cin >> N >> M)
{
init();
if(N == 0&&M == 0)
return 0;
int a, b, gs;
for(int i = 0; i < M; ++i)
{
cin >> a>> b>> gs;
if(guards[a][b] != 0)
{
guards[a][b] = INF;
guards[b][a] = INF;
continue;
}
G[a].push_back(b);
G[b].push_back(a);
guards[a][b] = gs;
guards[b][a] = gs;
}
ans = INF;
tarjan(1, 1);
bool tflag = false;
for(int i = 1; i <= N; ++i)
if(dfn[i] == 0)
tflag = true;
if(tflag)
cout << 0 <<endl;
else if(ans == INF)
cout<<-1<<endl;
else if(ans == 0&&++ans||ans)
cout << ans<<endl;
}
return 0;
}