题意:
给相连的两个站点之间的距离,求从起点到终点的最短路径
ps: 这道题目真是见过的最傻逼的题目了....不知道出题人是不是傻逼。。根本就没写双向路好不好!还特么傻逼一样加了“每行有站名s,站名e” 这么蛋疼的提示,坑人也特么不会真特么SB艹
code:
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <string>
#include <map>
#include <queue>
using namespace std;
const int MAXNODE = 100005;
const int MAXEDGE = 1000005;
typedef int Type;
const Type INF = 0x3f3f3f3f;
struct Edge {
int u, v;
Type dist;
Edge() {}
Edge(int u, int v, Type dist) {
this->u = u;
this->v = v;
this->dist = dist;
}
};
struct HeapNode {
Type d;
int u;
HeapNode() {}
HeapNode(Type d, int u) {
this->d = d;
this->u = u;
}
bool operator < (const HeapNode& c) const {
return d > c.d;
}
};
struct Dijkstra {
int n, m;
Edge edges[MAXEDGE];
int first[MAXNODE];
int next[MAXEDGE];
bool done[MAXNODE];
Type d[MAXNODE];
int p[MAXNODE];
void init(int n) {
this->n = n;
memset(first, -1, sizeof(first));
m = 0;
}
void add_Edge(int u, int v, Type dist) {
edges[m] = Edge(u, v, dist);
next[m] = first[u];
first[u] = m++;
}
void dijkstra(int s) {
priority_queue<HeapNode> Q;
for (int i = 0; i < n; i++) d[i] = INF;
d[s] = 0;
p[s] = -1;
memset(done, false, sizeof(done));
Q.push(HeapNode(0, s));
while (!Q.empty()) {
HeapNode x = Q.top(); Q.pop();
int u = x.u;
if (done[u]) continue;
done[u] = true;
for (int i = first[u]; i != -1; i = next[i]) {
Edge& e = edges[i];
if (d[e.v] > d[u] + e.dist) {
d[e.v] = d[u] + e.dist;
p[e.v] = i;
Q.push(HeapNode(d[e.v], e.v));
}
}
}
}
} gao;
int n;
map<string, int> ma;
int cnt;
int gg[200][200];
void init(){
ma.clear();
memset(gg, -1, sizeof(gg));
int st, ed;
cnt = 0;
string s1, s2;
cin >> s1 >> s2;
ma[s1] = cnt++;
st = cnt-1;
if(!ma.count(s2)){
ma[s2] = cnt++;
ed = cnt - 1;
}
else ed = ma[s2];
int u, v, w;
for(int i = 1; i <= n; i++){
cin >> s1 >> s2 >> w;
if(!ma.count(s1)){
ma[s1] = cnt++;
u = cnt-1;
}
else u = ma[s1];
if(!ma.count(s2)){
ma[s2] = cnt++;
v = cnt-1;
}
else v = ma[s2];
if(gg[u][v] == -1){
gg[u][v] = w;
gg[v][u] = w;
}
else{
gg[u][v] = min(gg[u][v], w);
gg[v][u] = gg[u][v];
}
}
gao.init(cnt);
for(int i = 0; i < cnt; i++){
for(int j = 0; j < cnt; j++){
if(gg[i][j] != -1)
gao.add_Edge(i, j, gg[i][j]);
}
}
gao.dijkstra(st);
if(gao.d[ed] >= INF) printf("-1\n");
else printf("%d\n",gao.d[ed]);
}
int main(){
while(scanf("%d",&n) !=EOF){
if(n == -1) break;
init();
}
return 0;
}