小记:这题完全是为了练习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就没了。。。。