【问题描述】
求一个无向连通图的割点。割点的定义是:若删除此结点和与其相关联的边,无向图不再连通。
【输入形式】
第一行是顶点个数及边的条数,后续每一行是每条边的两端关联的两个顶点
【输出形式】
割点,若没有割点,则输出NO
【样例输入】
7 8
A B
A D
B C
C D
C G
D E
D F
E F
【样例输出】
C D
【样例输入】
5 7
A B
B C
B D
A D
C D
A E
E C
【样例输出】
NO
#include<iostream>
#define maxsize 20
using namespace std;
int n;//顶点个数
int m;//关系组数
int g[maxsize][maxsize];
int visit[maxsize];
void copyGraph(int temp[maxsize][maxsize])
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
temp[i][j] = g[i][j];
}
}
}
int firstAdjNode(int g[maxsize][maxsize],int v)
{
for (int i = 1; i <= n; i++)
{
if (g[v][i] == 1)
{
return i;
}
}
return -1;
}
int nextAdjNode(int g[maxsize][maxsize],int v, int w)
{
for (int i = w + 1; i <= n; i++)
{
if (g[v][i] == 1)
{
return i;
}
}
return -1;
}
void dfs(int g[maxsize][maxsize],int v)
{
visit[v] = 1;
int w = firstAdjNode(g,v);
while (w != -1)
{
if (!visit[w])
{
dfs(g,w);
}
w = nextAdjNode(g,v, w);
}
}
void isGeDian(int temp[maxsize][maxsize])
{
bool falg = 0;
for (int i = 1; i <= n; i++)
{
int cnt = 0;
for (int j = 1; j <= n; j++)
{
temp[i][j] = 0;
temp[j][i] = 0;
}
for (int k = 1; k <= n; k++)
{
if (!visit[k])
{
dfs(temp, k);
cnt++;
}
}
if (cnt>2)
{
cout << char('A' + i - 1) << " ";
falg = 1;
}
copyGraph(temp);
fill(visit, visit + maxsize, 0);
}
if (!falg)
{
cout << "NO" << endl;
}
}
int main()
{
cin >> n >> m;
fill(g[0], g[0] + maxsize * maxsize, 0);
fill(visit, visit + maxsize, 0);
for (int i = 1; i <=m; i++)
{
char ch1, ch2;
cin >> ch1 >> ch2;
g[ch1 - 64][ch2 - 64] = 1;
g[ch2 - 64][ch1 - 64] = 1;
}
int temp[maxsize][maxsize];
copyGraph(temp);
isGeDian(temp);
//system("pause");
return 0;
}