一道模板题,WA了30+次
原因是题目没说清楚
1、这个图是双向图
2、可能会出现从一个点a到点a这种情况,应该输出0
3、可能起点或终点不再给出的站牌中出现,这是输出-1
还有一点原因是CE了10+次
因为用了map的find和count函数判别字符串是否出现
在本机上编译不会出错,但是交题就会各种Compile Error
大概是因为oj支持的c++版本比较低吧
百度后发现一个解决方法是添加#include <string>头文件
1609ms代码如下:
#include <map>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 210
#define LL long long
#define INF 0x7fffffff
using namespace std;
int g[MAXN][MAXN];
bool vis[MAXN];
int d[MAXN];
string st, en, s, e;
map<string, int> m;
map<string, int>::const_iterator it;
void Dijstra(int s, int cnt) {
int i, j, x, tmp;
memset(vis, 0, sizeof(vis));
for(i=0; i<cnt; ++i)
d[i] = INF;
d[s] = 0;
for(i=0; i<cnt; ++i) {
tmp = INF;
for(j=0; j<cnt; ++j) {
if(!vis[j] && d[j]<tmp)
tmp = d[x = j];
}
vis[x] = true;
for(j=0; j<cnt; ++j) {
if(g[x][j] < INF)
d[j] = min(d[j], d[x]+g[x][j]);
// printf("d[%d] = %d\n", j, d[j]);
}
}
}
int main(void) {
int i, j, t, x, y, n, cnt;
while(scanf("%d", &n) && (n!=-1)) {
for(i=0; i<MAXN-10; ++i) {
g[i][i] = 0;
for(j=i+1; j<MAXN-10; ++j)
g[i][j] = g[j][i] = INF;
}
cnt = 2;
m.clear();
cin >> st >> en;
m[st] = 0;
m[en] = 1;
for(i=0; i<n; ++i) {
cin >> s >> e >> t;
if(m.find(s) == m.end())
m[s] = cnt++;
if(m.find(e) == m.end())
m[e] = cnt++;
x = m[s];
y = m[e];
g[x][y] = g[y][x] = min(g[x][y], t);
}
if(st == en) {
cout << "0" << endl;
continue;
}
/*
cout << endl << endl;
for(it = m.begin(); it!=m.end(); ++it) {
cout << it->first << " " << it->second << endl;
}
*/
Dijstra(0, cnt);
if(d[1] != INF)
cout << d[1] << endl;
else cout << "-1" << endl;
}
return 0;
}