/home/a/j/nomad2:cat bridge.CPP
#include <iostream>
using namespace std;
const int V = 7;
int bridge, edge[V][V], anc[V], pre[V], vis[V];
void dfs(int cur, int father, int dep, int n)
{
if(bridge)
return;
vis[cur] = 1;
pre[cur] = anc[cur] = dep;
for(int i = 0; i < V; i++)
{
if(!edge[cur][i])
{
continue;
}
if(i != father && 1 == vis[i])
{
if (pre[i] < anc[cur])
{
anc[cur] = pre[i];
}
}
if(vis[i] == 0)
{
dfs(i, cur, dep + 1, n);
if (bridge)
{
return;
}
if(anc[i] < anc[cur])
{
anc[cur] = anc[i];
}
if(anc[i] > pre[cur])
{
bridge = 1;
cout << "found the bridge : " << cur << " -> " << i << endl;
return ;
}
}
}
vis[cur] = 2;
}
void input()
{
int v;
for(int i = 0; i < V; i++)
{
for(int j = 0; j < V; j++)
{
cin >> v;
edge[i][j] = v;
}
}
}
void init()
{
}
int main()
{
input();
dfs(0, -1, 1, V);
}
测试结果:
/home/a/j/nomad2:cat input
0 1 0 1 0 0 0
1 0 1 0 0 0 0
0 1 0 1 1 0 0
1 0 1 0 0 0 0
0 0 1 0 0 1 1
0 0 0 0 1 0 1
0 0 0 0 1 1 0
/home/a/j/nomad2:cat input|./a.out
found the bridge : 2 -> 4