对于给定的无向图以及图中的两个顶点,计算两个顶点所在的连通分量中的顶点数,并且判断这两个顶点之间是否有路径。
输入格式:
第一行是不超过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
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] node = new int[n];
int[] weight = new int[n];
for(int i=0;i<n;i++) {
node[i] = i;
weight[i] = 1;
}
int[][] map = new int[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) {
map[i][j] = sc.nextInt();
if(map[i][j]==1) {
int rooti = find(i, node);
int rootj = find(j, node);
if(rooti!=rootj) {
node[rootj] = rooti;
weight[rooti] += weight[rootj];
}
}
}
int x = sc.nextInt(), y = sc.nextInt();
int rooti = find(x, node);
int rootj = find(y, node);
System.out.println(weight[rooti]);
System.out.println(weight[rootj]);
if(rooti==rootj) {
System.out.println("Yes");
}
else {
System.out.println("No");
}
}
public static int find(int i, int[] node) {
while(node[i]!=i)
i = node[node[i]];
return i;
}
}
这个题实际上感觉挺简单的,我用到的方法是并查集,因为需要统计每个连通部分的节点数,所以更进一步来说是基于重量的连接的并查集算法,因为没有运行超时所以没再过多的优化,这个题是我最近感觉做的最顺畅的一个题了。