http://acm.hdu.edu.cn/showproblem.php?
pid=1385
求最短路。要求输出字典序最小的路径。
spfa:拿一个pre[]记录前驱,不同的是在松弛的时候。要考虑和当前点的dis值相等的情况,解决的办法是dfs找出两条路径中字典序较小的。pre[]去更新。
把路径当做字符串处理。
我仅仅用之前的pre去更新当前点,并没考虑到起点到当前点的整个路径,事实上这样并不能保证是字典序最小。wa了N次。于是乎搜了下题解,发现用spfa解的非常少。看到了某大牛的解法如上,感觉非常赞的想法。
#include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include <string.h> #include <queue> #define LL long long #define _LL __int64 using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 110; int n; int tax[maxn]; int Map[maxn][maxn]; int dis[maxn],inque[maxn]; int pre[maxn]; int pos = 0; void dfs(int u, char *s) { if(u == -1) return; dfs(pre[u],s); s[pos++] = u+'0'; } bool solve(int v, int u) { char s1[maxn],s2[maxn]; //寻找先前的路径 pos = 0; dfs(v,s1); s1[pos] = '