LeeBlog

导航

hdu 3790 最短路径问题

今天的这题有点悲剧,错就错在一个地方,在输入距离的时候,我把花费也考虑进去了,结果一只wa,没办法,看了大牛的代码才知道只要考虑距离;
#include<stdio.h>
int n,m,s,t;
int inf = 0x7fffffff,des[1024],dis[1024],map[1024][1024];
int co[1024],cost[1024][1024];
void Dijkstra(  )
{
     for( int i = 1; i <= n; ++i )
     {
          dis[i] = co[i] = inf;
          des[i] = 0;
      }
     dis[s] = co[s] = 0;
     for( int i = 1; i <= n; ++i )
     {
          int min = inf,pos = 0;
          for( int j = 1; j <= n ; ++j )
          {
               if( !des[j] )
                   if( dis[j] < min )
                   {
                       pos = j;
                       min = dis[j];
                   }
           }
           des[pos] = 1;
           if( min == inf )
               break; 
           for( int j = 1; j <= n; ++j )
           {
                int p,q;
                if( !des[j] )
                    if( map[pos][j] != inf )
                        if( p = map[pos][j] + dis[pos],p < dis[j] )
                        {
                            dis[j] = p;
                            co[j] = co[pos] + cost[pos][j]; 
                        }
                        else if( p == dis[j] )
                        {
                             if( q = cost[pos][j] + co[pos],q < co[j] )
                                 co[j] = co[pos] + cost[pos][j];
                         }
            }
      }
}
int main( )
{
    while( scanf( "%d%d",&n,&m ) , n|m )
    {
           for( int i = 0 ; i <= n; ++i )
           {
                for( int j = 0; j <= n; ++j )
                {
                     map[i][j] = cost[i][j] = inf;
                 }
            }
            for( int i = 0; i < m; ++i )
            {
                 int x,y,d,p;
                 scanf( "%d%d%d%d",&x,&y,&d,&p );
                 if( map[x][y] >= d )
                 {
                     map[x][y] = map[y][x] = d;
                     cost[x][y] = cost[y][x] = p;
                     } 
             }
             scanf( "%d%d",&s,&t );
             Dijkstra( );
             printf( "%d %d\n",dis[t],co[t] );
           }
    return 0;
}
原先的错误代码

#include<stdio.h>
int n,m,s,t;
int inf = 0x7fffffff,des[1024],dis[1024],map[1024][1024];
int co[1024],cost[1024][1024];
void Dijkstra(  )
{
     for( int i = 1; i <= n; ++i )
     {
          dis[i] = co[i] = inf;
          des[i] = 0;
      }
     dis[s] = co[s] = 0;
     for( int i = 1; i <= n; ++i )
     {
          int min = inf,pos = 0;
          for( int j = 1; j <= n ; ++j )
          {
               if( !des[j] )
                   if( dis[j] < min )
                   {
                       pos = j;
                       min = dis[j];
                   }
           }
           des[pos] = 1;
           if( min == inf )
               break; 
           for( int j = 1; j <= n; ++j )
           {
                int p,q;
                if( !des[j] )
                    if( map[pos][j] != inf )
                        if( p = map[pos][j] + dis[pos],p < dis[j] )
                        {
                            dis[j] = p;
                            co[j] = co[pos] + cost[pos][j]; 
                        }
                        else if( p == dis[j] )
                        {
                             if( q = cost[pos][j] + co[pos],q < co[j] )
                                 co[j] = co[pos] + cost[pos][j];
                         }
            }
      }
}
int main( )
{
    while( scanf( "%d%d",&n,&m ) , n|m )
    {
           for( int i = 0 ; i <= n; ++i )
           {
                for( int j = 0; j <= n; ++j )
                {
                     map[i][j] = cost[i][j] = inf;
                 }
            }
            for( int i = 0; i < m; ++i )
            {
                 int x,y,d,p;
                 scanf( "%d%d%d%d",&x,&y,&d,&p );
                 if( map[x][y] >= d && cost[x][y] >= p )
                 {
                     map[x][y] = map[y][x] = d;
                     cost[x][y] = cost[y][x] = p;
                     } 
             }
             scanf( "%d%d",&s,&t );
             Dijkstra( );
             printf( "%d %d\n",dis[t],co[t] );
           }
    return 0;
}

posted on 2011-03-21 14:00  LeeBlog  阅读(605)  评论(0编辑  收藏  举报