本文主要是介绍【最短路径】poj 1062,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 36705 | Accepted: 10577 |
Description
为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。
Input
Output
Sample Input
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
Sample Output
5250
Source
题意:就不多说了
思路:最短路问题,dijkstra算法的运用
重难点:
每个物品看成一个节点,酋长的允诺也看作一个物品, 如果一个物品加上金币可以交换另一个物品,
则这两个节点之间有边,权值为金币数,求第一个节点到所有节点的最短路。
因为有等级限制,所以枚举每个点作为最低等级,选取符合所有符合等级限制的点
最短路问题,不过因为存在着等级的差异所以需要枚举一下。本题的思路就是对冒险者的等级进行枚举,也就是说冒险者只能和在他等级以上的人进行交易。这样枚举的好处是能够把所有的情况都考虑进去。有一点需要注意:酋长的等级不一定是最高的
构图时要注意的是,酉长的承诺不是 最初的源点,它是一个目标点,也就是说点到点的指向方向是由 无替代品的点 逐渐指向到 酉长的承诺1点,题意说明的是一个回溯的过程,因此可以定义一个最初的源点0点,它到其他各点的权值就是每个物品的原价,而点A到点B的权值 就是 物品B在有第A号替代品情况下的优惠价
代码如下:
#include <stdio.h>
#include <string.h>
#define INF 0x7fffffff//无限大int price[110][110],vis[110],d[110],lv[110];//物品i在有第t号替代品情况下的优惠价pricr[t][i],当t=0时说明i无替代品,此时为原价
int dij(int n)
{int i,j,v,mina;for(i=1;i<=n;i++)d[i]=price[0][i];for(i=1;i<=n;i++){v = 0;mina = INF;for(j=1;j<=n;j++){if(!vis[j] && mina>d[j]){mina = d[j];v = j;}}if(v==0)break;vis[v]=1;for(j=1;j<=n;j++){if((!vis[j]) && (price[v][j]!=INF) && (d[j]>d[v]+price[v][j]))///必须要加上(price[v][j]!=INF)这一句否则越界d[j]=d[v]+price[v][j];}}//for(j=1;j<=n;j++)// printf("%d ",d[i]);return d[1]; //返回当前次交易后目标点1在等级lv[i]约束下的最短距离
}
int main()
{int i,j,k,m,n,num;int t,u,maxlv,temp,minprice=INF;//printf("%d\n",INF);scanf("%d%d",&m,&n);memset(vis,0,sizeof(vis));memset(lv,0,sizeof(lv));for(i=0;i<=n;i++)for(j=0;j<=n;j++)price[i][j]=INF;for(i=0;i<=n;i++)d[i]=INF;for(i=1;i<=n;i++){scanf("%d%d%d",&price[0][i],&lv[i],&num);//price[0][i]物品i无替代品时的原价for(j=1;j<=num;j++){scanf("%d%d",&t,&u);price[t][i]=u;}}minprice = INF;for(i=1;i<=n;i++){maxlv=lv[i];for(j=1;j<=n;j++){if(lv[j]>maxlv || maxlv -lv[j]>m)vis[j]=1;elsevis[j]=0;}temp = dij(n);//printf("%d\n",temp);if(minprice >temp)minprice = temp;}printf("%d\n",minprice);return 0;
}
//AC C++ 0MS 204K
//<span style="font-size:18px;">dijkstra</span>算法
体会:dijkstra算法的变形使用,多次求dijkstra
这篇关于【最短路径】poj 1062的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!