余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P179 算法7.11
程序的输入是一个名字为input.txt的文件,保存时注意编码格式再VS上运行的话要保存为ANSI编码,如果需要的话我可以上传一份
结点数 边数11
顶点1 顶点2
8 11
1 2
1 4
2 3
2 5
2 7
2 8
3 4
5 6
5 7
5 8
7 8
#include<iostream>
#include<fstream>
#include<stack>
using namespace std;
#define MAX 11//
#define MAXCOST 1
int COST[MAX][MAX];
int DFN[MAX];
int L[MAX];
int num;
int n;
stack<int> s;
void ART(int u, int v)
{
DFN[u] = num;
L[u] = num;
num++;
int w;
for (w = 1; w <= n; w++)
{
if (COST[u][w] == 0)
continue;
if ((v != w) && (DFN[w] < DFN[u]))
{
s.push(u);
s.push(w);
}
if (DFN[w] == 0)
{
ART(w, u);
if (L[w] >= DFN[u])
{
cout << "双连通分图\n";
int y;
int x;
do
{
y = s.top(); s.pop();
x = s.top(); s.pop();
cout << "(" << x << "," << y << ")";
} while (!((x == u&&y == w) || (x == w&&y == u)));
cout << endl;
}
if (L[u] > L[w])
L[u] = L[w];
}
else if (w != v)
{
if (L[u] > DFN[w])
L[u] = DFN[w];
}
}
}
int main()
{
int e;
int i, j, k;
ifstream in("input.txt");
in >>n >>e;
for (i = 0; i <= n; i++)
{
for (j = 0; j <= n; j++)
{
COST[i][j] = 0;
}
DFN[i] = 0;
}
for (int k = 1; k <= e; k++)
{
in >> i >> j;
COST[i][j] = MAXCOST;
COST[j][i] = MAXCOST;
}
num = 1;
int u=1, v=1;
ART(u,v);
cout << endl;
system("pause");
return 0;
}
运行结果