poj1062 昂贵的聘礼

这个一道最短路题;这里难处理的就是等级只差的问题;这里我们就用枚举法;假设等级只差为L=3;酋长的等级为5,这里就只存在这几种情况2-5,3-6,4-7,5-8;我们只要处理这几种情况就可以了;至于建图就直接用钱数就可以了;

View Code
#include<cstdio>

#include<iostream>

using namespace std;

const int inf = 0x7fffffff;

int level[124],map[124][124],L,N,dis[124],hash[124];

void Empty(  )

{

    for( int i = 0 ; i <= N; i ++ )

     {

          for( int j = 0 ; j <= N ; j ++ )

              map[i][j] = inf;

     }    

}

int Dij()

{

   int LL = level[1],ans=inf;

   for( int i = LL -L ; i <= LL ; i ++ )//枚举所有等级只差 

   {

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

        {

            dis[j] = map[0][j];

            hash[j] = 0;     

        }        

        hash[0] = 1;

        for( int j = 1; j <= N ; j ++ )//迪杰斯特拉 

        {

               int min = inf,t;

               for( int k = 1 ; k <= N ; k ++ )

               {

                if( !hash[k] && min > dis[k] && level[k] >= i && level[k] <= i + L )

                {//判断等级只差不能超出L 

                       min = dis[k] ; t = k;

                }        

            }

            hash[t] = 1;

            for( int k = 1 ; k <= N ; k ++ )

            {

               if( map[t][k]!= inf && !hash[k] && level[k] >= i && level[k] <= i + L)

                 if( dis[k] > min + map[t][k] )

                 {

                     dis[k] = min + map[t][k];    

                  }

            }

        } 

        if( ans > dis[1] ) ans = dis[1];

   }

   return ans;

}

int main( )

{

    int n,price,num;

    while( scanf( "%d %d",&L , &N  )==2 )

    {         

         Empty(  );

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

         {

              scanf( "%d %d %d",&price,&level[i],&n );

              map[0][i] = price;

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

              {

                  scanf( "%d %d",&num , &price );

                  map[num][i] = price;         

              }        

         }

         printf( "%d\n",Dij() );    

    }

    return 0;    

}

 

你可能感兴趣的:(poj)