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] = '