无向图,给出起点和终点,求最短路,基础题,只不过点成了字符串罢了,可以用map把字符串转化为编号,就可以像普通的最短路那样求了。
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#include<cstdio>
#include<map>
const int INF=0x3f3f3f3f;
typedef long long LL;
using namespace std;
const int maxn=10055;
struct Edge
{
int e; //终点
int w; //权值
Edge(int _e,int _w):e(_e),w(_w){}
Edge(){}
};
vector<Edge> G[maxn];
int N;
int dist[maxn];
int vis[maxn];
map<string,int> mp;
char S[100],T[100];
void spfa(int v)
{
memset(dist,INF,sizeof(dist));
memset(vis,0,sizeof(vis));
dist[v]=0;
queue<int> q;
q.push(v);
vis[v]=1;
while(!q.empty())
{
int s=q.front();q.pop();
vis[s]=0;
for(int i=0;i<G[s].size();i++)
{
int e=G[s][i].e;
if(dist[e]>dist[s]+G[s][i].w)
{
dist[e]=dist[s]+G[s][i].w;
if(!vis[e])
{
q.push(e);
vis[e]=1;
}
}
}
}
}
int main()
{
// freopen("E:\\ACM\\test.txt","r",stdin);
while(scanf("%d",&N))
{
if(N==-1) break;
mp.clear();
for(int i=0;i<maxn;i++) G[i].clear();
scanf("%s%s",S,T);
int s,e,w;
int cnt=0;
mp[S]=++cnt;
if(mp[T]==0) mp[T]=++cnt; //注意起点和终点一样的情况
char s1[100],s2[100];
for(int i=0;i<N;i++)
{
scanf("%s%s%d",s1,s2,&w);
if(mp[s1]==0) mp[s1]=++cnt;
if(mp[s2]==0) mp[s2]=++cnt;
s=mp[s1];e=mp[s2];
G[s].push_back(Edge(e,w));
G[e].push_back(Edge(s,w));
}
s=mp[S];e=mp[T];
spfa(s);
if(dist[e]!=INF) printf("%d\n",dist[e]);
else puts("-1");
}
return 0;
}