杭电 3790 最短路径问题

这个题目是套用dijstra()模板,但又拐了一个弯,本题每条路径上都有两个权值,本题不必考虑花费,直接球最短路,只是在更新顶点值的时候有一个特殊处理,求得花费。
#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int n,m,s,t;

int inf=0x7fffffff;

int hash[1010],dis[1010],map[1010][1010],pay[1010][1010],des[1010];

void dijstra()

{

     dis[s]=0;

     des[s]=0;

     for(int i=1;i<=n;i++)

     {

         int r=inf,pos; 

         for(int j=1;j<=n;j++)

         {

             if(hash[j]==0)

             {

                 if(dis[j]<r)

                 {

                     r=dis[j];

                     pos=j;

                 }

             }

         }

         hash[pos]=1;

         if(pos==t)  break;

         for(int j=1;j<=n;j++)

         {

             if(hash[j]==0)

             {

                 if(map[pos][j]!=inf)

                 {

                      if(dis[pos]+map[pos][j]<dis[j])

                      {

                            dis[j]=map[pos][j]+dis[pos];

                            des[j]=pay[pos][j]+des[pos];

                      }

                       else if(map[pos][j]+dis[pos]==dis[j])

                       {

                           if(pay[pos][j]+des[pos]<des[j])

                           {

                                des[j]=pay[pos][j]+des[pos];

                           }

                       }

                 }

             }

         }

     }

}

int main()

{ 

    int a,b;

    int d,p;

    while(scanf("%d%d",&n,&m),m||n)

    {

        for(int i=1;i<=n;i++)

        {

             dis[i]=inf;

             hash[i]=0;

             des[i]=inf;

             for(int j=1;j<=n;j++)

             {

                 map[i][j]=inf;

                 pay[i][j]=inf;        

             }

        }

        for(int i=1;i<=m;i++)

        {

            scanf("%d%d%d%d",&a,&b,&d,&p);

            if(a!=b&&map[a][b]>=d)

            {

                map[a][b]=map[b][a]=d;

                pay[a][b]=pay[b][a]=p;

            }

            /*if(a!=b&&map[a][b]>=d)

            {

                 map[a][b]=map[b][a]=d;

            }

            if(a!=b&&pay[a][b]>=p)

            {

                 pay[a][b]=pay[b][a]=p;

            }*///此处为错误代码,刚开始因为写的是这个,结果一直wa,后来参考了别人的代码,将此处改了一下,结果AC了 。 

        }

        scanf("%d%d",&s,&t);

        dijstra();

        printf("%d %d\n",dis[t],des[t]);

    }

    //system("pause");

    return 0;

}

编辑器加载中...

你可能感兴趣的:(最短路径)