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;    
}

 

posted @ 2012-07-01 08:44  wutaoKeen  阅读(158)  评论(0编辑  收藏  举报