题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1747
题目大意:
从1点到N点走2次,两次的路径要求不能经过任意一条重边,求总代价最小,若不能则输出”Back to jail“。
解题:
很容易以为是最短路,走两遍最短路,第一遍过程中记录下最短路上的边,删去。网上很多题解都说明显是错的,但似乎没有给出证明。个人认为应该是,当同时存在两条以上最短路时,任选一条,会造成错误,若最短路唯一,这样做应该是对的。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
int mapp[105][105],cnt;
int dist[105],path[105];
bool vis[105];
struct edge
{
int aft,bef;
}store[10010];
void init(int n)
{
cnt=0;
memset(vis,0,sizeof(vis));
memset(mapp,inf,sizeof(mapp));
memset(dist,inf,sizeof(dist));
memset(path,0,sizeof(path));
for(int i=1;i<=n;i+&#