题目:HDU Today
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<map>
#include<queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 9;
int N;
string start, ende, s1, s2;
map<string, int> Name;
int num, t;
struct Edge
{
int to, w, nxt;
}edge[MAXN * 2];
int head[MAXN], cnt;
void init()
{
Name.clear(); num = 0;
memset(head, -1, sizeof(head)); cnt = 0;
}
void addEdge(int u, int v, int w)
{
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].nxt = head[u];
head[u] = cnt++;
}
struct node
{
int nod, w;
node(int _nod, int _w):nod(_nod), w(_w) {}
bool operator < (const node &o) const
{
return w > o.w;
}
};
int dis[MAXN], vis[MAXN];
int dijkstra()
{
if(Name[start] == Name[ende]) return 0;
memset(dis, INF, sizeof(dis)); dis[Name[start]] = 0;
memset(vis, 0, sizeof(vis)); vis[Name[start]] = 1;
priority_queue<node> q;
q.push({Name[start], 0});
while(!q.empty())
{
struct node now = q.top(); q.pop();
int u = now.nod;
vis[u] = 1;
for(int i = head[u]; i != -1; i = edge[i].nxt)
{
int to = edge[i].to;
if(!vis[to] && dis[to] > dis[u] + edge[i].w)
{
dis[to] = dis[u] + edge[i].w;
q.push({to, dis[to]});
}
}
}
if(dis[Name[ende]] == INF) return -1;
return dis[Name[ende]];
}
int main()
{
while(scanf("%d", &N) == 1 && (N != -1))
{
init();
cin >> start >> ende;
Name[start] = ++num; // num为车站标号
Name[ende] = ++num;
for(int i = 1; i <= N; i++)
{
cin >> s1 >> s2 >> t;
if(!Name[s1]) Name[s1] = ++num;
if(!Name[s2]) Name[s2] = ++num;
addEdge(Name[s1], Name[s2], t); // 加边
addEdge(Name[s2], Name[s1], t);
}
int ans = dijkstra();
printf("%d\n", ans);
}
return 0;
}