对于给定的无向图以及图中的两个顶点,计算两个顶点所在的连通分量中的顶点数,并且判断这两个顶点之间是否有路径。
第一行是不超过20
的正整数N
,表示图有N
个顶点,顶点的编号即0
~N-1
;
接下来N
行,是N*N
的邻接矩阵,矩阵的元素间用空格分隔;
最后一行是用空格隔开的两个顶点编号v
和w
第一行输出v
所在的连通分量的顶点数
第二行输出w
所在的连通分量的顶点数
第三行,若v
和w
之间有路径,则输出Yes
,否则输出No
注意:当v
和w
是同一个顶点时,认为v
和w
之间是有路径的。
对于这个图:
8
0 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0
1 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 3
5
2
No
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdbool.h>
#include <stdio.h>
#define N 20
void dfs(int v, int n, bool visit[], int adj[N][N], int *count)
{
visit[v] = true;
(*count)++;
for (int i = 0; i < n; i++)
{
if (adj[v][i] == 1 && !visit[i])
{
dfs(i, n, visit, adj, count);
}
}
}
bool Connected(int v, int w, int n, bool visit[], int adj[N][N])
{
if (v == w)
return true;
visit[v] = true;
for (int i = 0; i < n; i++)
{
if (adj[v][i] == 1 && (!visit[i] || i == w))
{
if (i == w || Connected(i, w, n, visit, adj))
{
return true;
}
}
}
return false;
}
int main()
{
int n;
scanf("%d", &n);
int adj[N][N];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &adj[i][j]);
}
}
int v, w;
scanf("%d %d", &v, &w);
bool visit[N] = {false};
int countV = 0;
dfs(v, n, visit, adj, &countV);
printf("%d\n", countV);
for (int i = 0; i < n; i++)
{
visit[i] = false;
}
int countW = 0;
dfs(w, n, visit, adj, &countW);
printf("%d\n", countW);
for (int i = 0; i < n; i++)
{
visit[i] = false;
}
bool connected = Connected(v, w, n, visit, adj);
if (connected)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容