#include<cstdlib>
#include<iostream>
#include<sstream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include <algorithm>
#include<vector>
#include<set>
#include<queue>
#define LL long long
#define inf 0x7f7f7f7f
#define E 1e-9
#define N 105
#define M 2000000
using namespace std;
int n,m;
int q[N];//循环队列
int d[N];
int inq[N],fa[N];
int ma[N][N];
void init()
{
memset(inq,0,sizeof(inq));
fill(d+1,d+n+1,inf);
d[1]=0;
}
void spfa()
{
init();
int r=0,f=0;
q[r++]=1;
inq[1]=1;
fa[1]=1;
while(f!=r)
{
int u=q[f++];
if(f==N-1)
f=0;
for(int i=1; i<=n; i++)
if(ma[u][i]!=inf)
{
if(d[i]>d[u]+ma[u][i])
{
d[i]=d[u]+ma[u][i];
fa[i]=u;
if(!inq[i])
{
q[r++]=i;
if(r==N-1)
r=0;
inq[i]=1;
}
}
}
inq[u]=0;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ex.in","r",stdin);
#endif
while(scanf("%d",&n),n)
{
int x,y,z;
scanf("%d",&m);
memset(ma,0x7f,sizeof(ma));
for(int i=0; i<m; ++i)
{
scanf("%d%d%d",&x,&y,&z);
ma[x][y]=ma[y][x]=z;
}
// cout<<"top="<<top<<endl;
// for(int i=1; i<=n; i++)
// {
// cout<<"head[i]="<<head[i]<<endl;
// for(int j=head[i]; j!=-1; j=next[j])
// {
// Node *p=&temp[j];
// cout<<i<<" ";
// }
// cout<<endl;
// }
spfa();
int sum=d[n];
if(sum==inf)
{
printf("Back to jail\n");
continue;
}
// for(int i=1; i<=n; i++)
// cout<<d[i]<<" ";
// cout<<endl;
// for(int i=1; i<=n; i++)
// cout<<fa[i]<<" ";
// cout<<endl;
for(int i=n; i!=1; i=fa[i])
{
ma[fa[i]][i]=inf;
ma[i][fa[i]]=-ma[i][fa[i]];
}
spfa();
// for(int i=1; i<=n; i++)
// cout<<d[i]<<" ";
// cout<<endl;
// for(int i=1; i<=n; i++)
// cout<<fa[i]<<" ";
// cout<<endl;
if(d[n]==inf)
{
printf("Back to jail\n");
continue;
}
sum+=d[n];
printf("%d\n",sum);
}
return 0;
}
10806 - Dijkstra, Dijkstra.-------好题(想不到的思路!!)--两次spfa--神奇般的对了
最新推荐文章于 2019-04-20 16:08:00 发布