7-6 两点间有路径吗?

对于给定的无向图以及图中的两个顶点,计算两个顶点所在的连通分量中的顶点数,并且判断这两个顶点之间是否有路径。

输入格式:

第一行是不超过20的正整数N,表示图有N个顶点,顶点的编号即0~N-1

接下来N行,是N*N的邻接矩阵,矩阵的元素间用空格分隔;

最后一行是用空格隔开的两个顶点编号vw

输出格式:

第一行输出v所在的连通分量的顶点数

第二行输出w所在的连通分量的顶点数

第三行,若vw之间有路径,则输出Yes,否则输出No

注意:当vw是同一个顶点时,认为vw之间是有路径的。

输入样例:

对于这个图: fig.jpg

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;
	}
}

这个题实际上感觉挺简单的,我用到的方法是并查集,因为需要统计每个连通部分的节点数,所以更进一步来说是基于重量的连接的并查集算法,因为没有运行超时所以没再过多的优化,这个题是我最近感觉做的最顺畅的一个题了。

发布了46 篇原创文章 · 获赞 42 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章