看望朋友
【题目描述】
话说运气极其不好的Yoyo_Yao在某年某月某日得了水痘,于是GoldenSun去看她。
已知Yoyo_Yao家住x点,GoldenSun家住w点。GoldenSun从自己家坐车过去,中途可能经过一些点。从一个点到另一个店,有的有直接的直路相连,有的没有,可以从其它点绕行。由于急着见到Yoyo_Yao,GoldenSun必须尽快赶到。
已知出租车收费1元/km。
请你帮GoldenSun算算他坐车要多少钱才能到。
【输入格式】
输入文件第一行为整数,即经过的店数n。
接下来的n行是一个n*n的矩阵,矩阵中第i行j列的整数表示第i点到第j点的距离(无路表示为0),每行的n个整数之间用空格隔开。 (0<n<=100)
接下来是可能的编号总数k。
最后是x编号和w编号。每排一组。
【输出格式】
每组编号对应的最少花费,一排一组(按编号输入的顺序)。
【输入样例】
3
0 1 10
1 0 2
10 2 0
2
1 3
2 3
【输出样例】
3
2
这是一条比较水的多源最短路径,直接floyd求解....
#include<cstdlib>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
FILE *fin = fopen("friends.in", "r");
FILE *fout = fopen("friends.out", "w");
const int M=105;
int map[M][M];
int a[M];
int b[M];
int n, m;
int main()
{
fscanf(fin, "%d", &n);
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
fscanf(fin, "%d", &map[i][j]);
fscanf(fin, "%d", &m);
for (int i=1; i<=m; i++){
fscanf(fin, "%d %d", &a[i], &b[i]);
}
for (int i=1; i<=n; i++)
for (int k=1; k<=n; k++)
for (int j=1; j<=n; j++)
{
if (i!=k && i!=j && j!=k)
map[i][j]=min(map[i][j], map[i][k]+map[k][j]);
}
for (int i=1; i<=m; i++)
{
fprintf(fout, "%d\n", map[a[i]][b[i]]);
}
fclose(fin);
fclose(fout);
return 0;
}