题目大意:给出m个仓库的名字,及两两能直接到的仓库名字,求指定2仓库之间的最短距离
解题思路:用map实现映射,再用千年不变floyed求最短路,格式输出很变态
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <list>
using namespace std;
const int maxn = 30+10;
const int INF = 0xffffff;
int dis[maxn][maxn];
void warshall_floyd()
{
for(int k = 1; k <= maxn; k++)
{
for(int i = 1; i <= maxn; i++)
{
for(int j = 1; j <= maxn; j++)
{
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
int main()
{
int t,m,n,p,x;
string s,s1,s2;
map<string,int> mp;
int cas = 1;
scanf("%d",&t);
while(t--)
{
for(int i = 1; i <= maxn; i++)
{
for(int j = 1; j <= maxn; j++)
{
if(i == j)
{
dis[i][j] = 0;
}
else
{
dis[i][j] = INF;
}
}
}
scanf("%d%d%d",&m,&n,&p);
for(int i = 1; i <= m; i++)
{
cin>>s;
mp[s] = i;
}
for(int i = 1; i <= n; i++)
{
cin>>s1>>s2;
dis[mp[s1]][mp[s2]] = 1;
dis[mp[s2]][mp[s1]] = 1;
}
warshall_floyd();
if(cas == 1)
printf("SHIPPING ROUTES OUTPUT\n\n");
printf("DATA SET %d\n\n",cas++);
for(int i = 1; i <= p; i++)
{
cin>>x>>s1>>s2;
if(dis[mp[s1]][mp[s2]] != INF && dis[mp[s1]][mp[s2]])
{
printf("$%d\n",x*dis[mp[s1]][mp[s2]]*100);
}
else
{
printf("NO SHIPMENT POSSIBLE\n");
}
}
printf("\n");
if(!t)
printf("END OF OUTPUT\n");
}
return 0;
}