对于给定的无向图以及图中的两个顶点,计算两个顶点所在的连通分量中的顶点数,并且判断这两个顶点之间是否有路径。
输入格式:
第一行是不超过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
结尾无空行
深搜
#include<iostream>
using namespace std;
int A[22][22];
int N;
int Visited[20];
int cnt;
int dfs(int a)
{
Visited[a] = 1;
cnt++;
for(int i = 0;i<N;i++){
if(A[i][a]==1){
if(!Visited[i])
dfs(i);
}
}
}
int main()
{
cin>>N;
for(int i = 0;i<N;i++)
{
for(int j = 0;j<N;j++)
cin>>A[i][j];
}
int v,m;
cin>>v>>m;
int V,M;
dfs(v);
V = cnt;
for(int i = 0;i<N;i++)Visited[i] = 0;
cnt = 0;
dfs(m);
M = cnt;
cout<<V<<endl<<M<<endl;
if(Visited[v])cout<<"Yes";
else cout<<"No";
return 0;
}