Daizi's path system

来源:互联网 发布:slf4j 日志 sql 编辑:程序博客网 时间:2024/04/28 14:03

http://cs.scu.edu.cn/soj/problem.action?id=2427
题目
 呆子是个没有方向感的人,经常在科大校园内迷路,所以他经常手里拿着一张 地图。每天呆子都在科大校园内转来转去,寻找新奇的人和事物,但是呆子 不是一个喜欢浪费时间的人,每次转悠的时候,他总想找到一条从起点到终点 的最短路。现在这个任务就交给了你,希望你给呆子设计一个查询系统, 呆子每次只需要输入起点和终点,你就要告诉呆子这两点间的最短路是什么。

输入

 输入可能有多组。 每组输入的第一行包括两个数字 n和m,其中1 <= n <= 100,表示地图上 的路口的个数(呆子只会从一个路口到另外一个路口),0 <= m < n(n-1)/2, 表示图上的小路的个数,每条小路连接一对路口。 如果m > 0,那么后面将紧跟m行,每行包括三个整数,分别是这条路连接 的两个路口i,j(1<=i,j<=n)和这条路的长度L(1<=L<=1000)。
 
我们保证,输入的地图都是对的,而且没有两个路口之间存在两条或以上 的路,每条路的长度都是正的,还有这里的路都是双向的,没有一条路 是连接两个相同的路口。 紧接下来的一行是一个整数100000 > k > 0,表示有多少次查询。 紧接下来的k行,每行由两个整数i,j组成,表示查询这两个路口之间的最短路 的长度。(1 <= i,j <= n) 最后一组输入保证 n = 0, 这组输入不需要处理。

输出
 对每组输入的每个查询,单独使用一行来输出查询结果:如果两个路口之间 存在一条路,输出其最短路的长度;否则输出“pity”(引号不用输出)。 每组输出使用一个空行作为结尾。
输入例子
3 3
1 2 1
2 3 1
1 3 1
2
1 2
1 3
 3 3
 1 2 1
 2 3 1
 1 3 1
 2
 1 2
 1 3
 0 0
输出例子
 1
 1

 1
 1
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
#include<stdio.h>
#include<iostream>
#define NN 200000000
int main()
{
int i,j,k,m,n,x,y,z;
int map[105][105];
while(scanf("%d%d",&m,&n),m,n)
{
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
map[i][j]=NN;

for(i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(map[x][y]>z)
map[y][x]=map[x][y]=z;
}
for(i=1;i<=m;i++)
map[i][i]=0;
for(k=1;k<=m;k++)
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&x,&y);
if(map[x][y]<NN)
printf("%d\n",map[x][y]);
else
printf("pity\n");
}
printf("\n");
}
return 0;
}