Description
吉姆雷诺的游骑兵们想要摧毁蒙斯克帝国的一个要塞,但是游骑兵们需要找到一条最快的路径来抵达要塞并摧毁。这样的突袭是蒙斯克绝对想不到的。现在游骑兵找来了一张地图,地图上标出了所有可以通行的路,游骑兵标出了每条路的长度和这条路上允许的最快速度。已知每单位距离消耗的油是一定的,吉姆雷诺想知道如果选择最快的路径到达要塞需要准备多少石油。游骑兵们的出发地点是一个叫carle的地方,要塞所在的地方叫mensker
Input
本题有多组测试数据,一直处理到文件结束。对于每组数据,先输入三个整数n、m和k表示地点的个数(n不会超过1000)和每两个地点间的公路数目和每个单位距离消耗的油量,接下来有m行数据,输入方式如下:
地点1 地点2 公路长度 允许最大速度
Output
输出吉姆雷诺需要准备的单程石油数量并换行
Sample Input
4 3 1
carle temp 100 50
temp mensker 100 10
carle somewhere 100 100
Sample Output
200
参考代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <string>
#define INF 0x3f3f3f
using namespace std;
double Time[1005][1005];
double Speed[1005][1005];
int vis[1005];
double disT[1005];
double disS[1005];
int n, m, k;
int startPoint;
int endPoint;
void Dijkstra(int st, int ed)
{
for (int i = 1;i <= n;i++)
{
vis[i] = 0;
}
for (int i = 1;i <= n;i++)
{
disT[i] = Time[st][i];
disS[i] = Speed[st][i] * Time[st][i];
}
vis[st] = 1;
disT[st] = 0;
disS[st] = 0;
int u;
for (int i = 1;i <= n-1;i++)
{
double min = INF;
for (int j = 1;j <= n;j++)
{
if (!vis[j] && min > disT[j])
{
u = j;
min = disT[j];
}
}
vis[u] = 1;
for (int l = 1;l <= n;l++)
{
if (Time[u][l] != INF)
{
if (disT[l] > disT[u] + Time[u][l])
{
disT[l] = disT[u] + Time[u][l];
disS[l] = disS[u] + Time[u][l] * Speed[u][l];
}
}
}
}
}
int main()
{
while (cin>>n>>m>>k)
{
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= n;j++)
{
if (i == j)
{
Time[i][j] = 0;
}
else
{
Time[i][j] = INF;
}
Speed[i][j] = 0;
}
}
for (int i = 1;i <= n;i++)
{
disT[i] = INF;
disS[i] = INF;
}
int id = 1;
map<string, int>s;
for (int i = 1;i <= m;i++)
{
string st,ed;
double len,v;
cin >> st >> ed >> len >> v;
if (!s[st])
s[st] = id++;
if (!s[ed])
s[ed] = id++;
if (st == "carle")
startPoint = s[st];
if (ed == "mensker")
endPoint = s[ed];
Time[s[st]][s[ed]] = len / v;
Speed[s[st]][s[ed]] = v;
}
Dijkstra(startPoint, endPoint);
printf("%.0lf\n", disS[endPoint]*k);
}
}