小記:這題完全是爲了練習stl的,畢竟解法有很多,做的過程中,確實發現我的stl能力以及對平臺的瞭解確實很不到位,wa了N次。
思路:我寫的代碼是spfa+map+vector
spfa來尋找最短路, map來對字符串打上標記,vector來當鄰接表。用以加速spfa。雖然我當初是覺得自己寫個前向星也是可以的。當時純當練stl了。
這題也可以用dijsktra來找最短路,trie樹來hash,鄰接表的話自己可以隨便選,數組的鄰接表當然更快些。 所以前向星是個不錯的選擇。
因爲dijsktra寫的比較多,而spfa很久沒寫了,於是就用了spfa。
之前用scanf輸入字符串,定義是 char str[MAX_]; string s1; scanf讀站名到str裏, 然後我直接賦給s1的,因爲用的是map。即s1 = str;
這樣我的codeblocks 是沒報錯或者警告的,而hdu的平臺也沒報錯,但是TLE。 應該是很花時間的,交的c++的。所以改了用cin讀入。
而且這裏也出了wa,我沒include<string>, 但是我定義string s1; 也沒報錯,codeblocks全自動添加的。。。。 然後提交上去就CE
然後g++ TLE, c++ 1670+ms 過的。
代碼:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <string>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define REP(a,b,c) for(int a = b; a < c; ++a)
#define eps 10e-8
const int MAX_ = 155;
const int N = 100010;
const int INF = 0x7fffffff;
int n;
struct node{
int s, t;
};
map<string, int> mp;
vector<node> g[MAX_];
int d[MAX_];
bool vis[MAX_];
int m, cnt;
void spfa(int start, int end)
{
queue<int> q;
q.push(start);
REP(i, 0, MAX_){
vis[i] = 0;
d[i] = INF;
}
vis[start] = 1;
d[start] = 0;
while(!q.empty()){
int cur = q.front(); q.pop();
vis[cur] = 0;
REP(i, 0, g[cur].size()){
int s, t;
s = g[cur][i].s;
t = g[cur][i].t;
if(d[s] > d[cur] + t){
d[s] = d[cur] + t;
if(!vis[s]){
vis[s] = 1;
q.push(s);
}
}
}
}
if(d[end] >= INF){
puts("-1");//printf("-1\n");
}else
printf("%d\n", d[end]);
return ;
}
int main(){
int T, ss, tt;
while(~scanf("%d", &n)){
if(n == -1)break;
mp.clear();
REP(i, 0, MAX_){
g[i].clear();
}
cnt = 1;
string s1,s2;
cin>>s1>>s2;
/*
if(s1.compare(s2) == 0 ){
printf("0\n");continue;
}
else if(n == 0){
printf("-1\n");continue;
}
*/
ss = mp[s1] = cnt++;
if(mp[s2] == 0)
mp[s2] = cnt++;
tt = mp[s2];
REP(i, 0, n){
cin>>s1>>s2>>m;
int s, t;
if(mp[s1] == 0){
mp[s1] = cnt++;
}
s = mp[s1];
if(mp[s2] == 0){
mp[s2] = cnt++;
}
t = mp[s2];
node tmp;
tmp.t = m;
tmp.s = s;
g[t].push_back(tmp);
tmp.s = t;
g[s].push_back(tmp);
}
spfa(ss,tt);
}
return 0;
}
這和discuss裏的那位比較像,但是我已經把我之前的代碼改的面目全非了, 本來是有個compare的方法的,目的是去掉起點和終點相同的情況。
但是它給了個OLE, 刪掉compare就沒了。。。。