这个题 刚开始用了2次spfaWA了 查了下题解发现是网络流的问题 但有人用spfa过了
一直不明白原理 为什么改成负边可以AC 改成INF不能过 求出来的最短路不应该是一样的吗?
求大神指点。
#include<cstdio>
#include<cstring>#define maxn 210
#define maxe 1010
#define INF 1<<30
int n,m,edge[maxn][maxn],dist[maxn];
int queue[maxe],path[maxn];
bool vis[maxn];
void init(int s)
{
for(int i = 1; i <= n; i++)
dist[i] = INF;
dist[s] = 0;
memset(vis,0,sizeof(vis));
}
int spfa(int s)
{
init(s);
int head = 0,tail = 1;
queue[0] = s;
dist[s] = 0;
while(head < tail)
{
int u = queue[head];
vis[u] = true;
for(int i = 1; i <= n; i++)
{
if(dist[i]>dist[u]+edge[u][i])
{
dist[i]=dist[u]+edge[u][i];
path[i]=u;
if(!vis[i])
{
vis[i] = true;
queue[tail] = i;
tail++;
}
}
}
vis[u] = false;
head++;
}
}
int main()
{
int f,to,di;
while(scanf("%d",&n)==1)
{
if(!n) break;
scanf("%d",&m);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i==j) continue;
edge[i][j] = INF;
}
}
for(int i = 0; i < m; i++)
{
scanf("%d %d %d",&f,&to,&di);
edge[f][to] = edge[to][f] = di;
}
spfa(1);
int x = dist[n];
int s = n;
if(x>=INF)
{
printf("Back to jail\n");
continue;
}
while(s!=1)
{
edge[s][path[s]] = INF;//-edge[s][path[s]];
edge[path[s]][s] = INF;
s = path[s];
}
memset(vis,0,sizeof(vis));
spfa(1);
int y = dist[n];
if(x>=INF||y>=INF)
printf("Back to jail\n");
else
printf("%d\n",x+y);
}
return 0;
}