题目意思
给你三个数,N,C,R分别代表N个地点,C辆车和M条路,已知这M条路有单向的也有双向的,现在给你一个起点和C个终点,要你求从起点开始走到终点再走回的最短距离。
解题思路
由于路有双向的有单向的,所以去的路与返回的路径不一定相同,所以就求起点到终点的最短距离加上终点的起点的最短距离就好了,跑一遍最短路就行。要注意的是数据的输入时字符串,要记得处理一下。
代码部分
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
int n,c,r;
int maps[1005][1005];
char str[1005][100];
map <string,int> M;
void floyd()
{
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(maps[i][j]>maps[i][k]+maps[k][j])
maps[i][j]=maps[i][k]+maps[k][j];
}
int main()
{
char s1[100],s3[100];
char from,to;
int sum,cnt,dis,start,cas=1;
while(~scanf("%d%d%d",&n,&c,&r),n+c+r)
{
sum=0;
M.clear();
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
maps[i][j]=INF;
for(int i=0; i<=c; i++)
scanf("%s",str[i]);
cnt=1;
for(int i=0; i<r; i++)
{
scanf("%s %c-%d-%c %s",s1,&from,&dis,&to,s3);
if(!M[s1])
M[s1]=cnt++;
if(!M[s3])
M[s3]=cnt++;
int x=M[s1],y=M[s3];
if(from=='<'&&dis<maps[y][x])
maps[y][x]=dis;
if(to=='>'&&dis<maps[x][y])
maps[x][y]=dis;
}
floyd();
start=M[str[0]];
for(int i=1; i<=c; i++)
sum+=maps[start][M[str[i]]]+maps[M[str[i]]][start];
printf("%d. %d\n",cas++,sum);
}
return 0;
}