poj 1062 dij

本文解析了POJ 1062题目的解决方案,通过构建图模型来解决最短路径问题。文章详细介绍了如何根据题目条件建立图结构,并使用Dijkstra算法求解最低成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

 

            如题:http://poj.org/problem?id=1062

 

 

          这一题不难发现,就是一个最短路径的问题,题目已经规定最终要换到的物品是第一个,然后给出另外几个可以优惠的节点,比如这个图,0-1的最小代价是0-4-3-1   也就是5250。

 

       如何建图?0是源点,map【0】【i】代表第i个物品直接兑换的价值,map[j][i]代表如果已经有了编号j的物品,从j物品再map[j][i]的价值就可以兑换到i。

 

      注意题目说    “如果两人地位等级差距超过了M,就不能"间接交易"。“

                           枚举N个物品主人的等级作为商人的等级,商人只能和比他小,并且差距《=M的人交易。

 

 

               

 

 

 

 

 

#include<cstdio>
#include<cstring>
#define MAXN 105
#define inf 0x0fffffff

struct good
{
 int price,level,replace;
}g[MAXN];

int map[MAXN][MAXN];
bool vis[MAXN];
int dist[MAXN];
int M,N;


int dij()
{
 int i,j;
 for(i=0;i<=N;i++)
  dist[i]=map[0][i];
 for(i=1;i<=N;i++)
 {
  int min=inf,minid=0;
  for(j=1;j<=N;j++)
  {
   if(!vis[j]&&dist[j]<min)
   {
    min=dist[j];
    minid=j;
   }
  }
  vis[minid]=true;
  for(j=1;j<=N;j++)
   if(!vis[j]&&dist[j]>dist[minid]+map[minid][j])
    dist[j]=dist[minid]+map[minid][j];
 }
 return dist[1];
}
int main()
{
 //freopen("C:\\1.txt","r",stdin);
 scanf("%d%d",&M,&N);
 int i,j;
 for(i=1;i<=N;i++)
  for(j=1;j<=N;j++)
   map[i][j]=inf;
 for(i=1;i<=N;i++)
 {
  scanf("%d%d%d",&g[i].price,&g[i].level,&g[i].replace);
  map[0][i]=g[i].price;
  for(j=1;j<=g[i].replace;j++)
  {
   int u,w;
   scanf("%d%d",&u,&w);
   map[u][i]=w;
  }
  
 }
 int min=inf;
 int allow_level=0; 
 for(i=1;i<=N;i++)
 {
  allow_level=g[i].level;
  for(j=1;j<=N;j++)
   if(g[j].level>allow_level||allow_level-g[j].level>M)
    vis[j]=true;
   else
    vis[j]=false;
  int temp=dij();
  if(min>temp)
   min=temp;
 }
 printf("%d\n",min);
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值