这个题目是套用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;
}

编辑器加载中...

posted on 2011-07-18 20:10  枫叶飘泪  阅读(387)  评论(0编辑  收藏  举报