首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

10806 - Dijkstra, Dijkstra.美题(想不到的思路!)-两次spfa-神奇般的对了

2012-10-16 
10806 - Dijkstra, Dijkstra.-------好题(想不到的思路!!)--两次spfa--神奇般的对了#includecstdlib#inc

10806 - Dijkstra, Dijkstra.-------好题(想不到的思路!!)--两次spfa--神奇般的对了

#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 2000000using 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;}

热点排行