最爱的城市
时间限制:1 秒
内存限制:32 兆
特殊判题:否
标签
- Floyd最短路径
题目描述
一天小明捧着一本世界地图在看,突然小明拿起笔,将他最爱的那些城市标记出来,并且随机的将这些城市中的某些用线段两两连接起来。
小明量出了每条线段的长度,现在小明想知道在这些线段组成的图中任意两个城市之间的最短距离是多少。
输入格式
输入包含多组测试数据。
每组输入第一行为两个正整数n(n<=10)和m(m<=n*(n-1)/2),n表示城市个数,m表示线段个数。
接下来m行,每行输入三个整数a,b和l,表示a市与b市之间存在一条线段,线段长度为l。(a与b不同)
每组最后一行输入两个整数x和y,表示问题:x市与y市之间的最短距离是多少。(x与y不同)
城市标号为1~n,l<=20。
输出
对于每组输入,输出x市与y市之间的最短距离,如果x市与y市之间非连通,则输出“No path”。
样例输入
4 4
1 2 4
1 3 1
1 4 1
2 3 1
2 4
样例输出
3
【分析】
,求出各顶点到其他顶点的最短路径。
用java语言编写程序,代码如下:
import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(new BufferedInputStream(System.in));
final int INF = 1000;
while(input.hasNext()) {
int n = input.nextInt();
int m = input.nextInt();
int[][] dist = new int[n + 1][n + 1];
for(int i = 0; i < n + 1; i++)
Arrays.fill(dist[i], INF);
int a, b, len;
for(int i = 0; i < m; i++) {
a = input.nextInt();
b = input.nextInt();
len = input.nextInt();
dist[a][b] = dist[b][a] = len;
}
int x = input.nextInt();
int y = input.nextInt();
floyd(n, dist);
if(dist[x][y] == INF)
System.out.println("No path");
else
System.out.println(dist[x][y]);
}
}
public static void floyd(int n, int[][] dist) {
for(int k = 1; k <= n; k++)
for(int u = 1; u <= n; u++)
for(int v = 1; v <= n; v++)
if(dist[u][v] > dist[u][k] + dist[k][v])
dist[u][v] = dist[u][k] + dist[k][v];
}
}