标签:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 37954 | Accepted: 10975 |
Description
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
思路:每个物品看成一个节点,酋长的允诺也看作一个物品, 如果一个物品加上金币可以交换另一个物品,则这两个节点之间有边,权值为金币数,求第一个节点到所有节点的最短路。因为有等级限制,所以枚举每个点作为最低等级,选取符合所有符合等级限制的点。
PS:构图时要注意的是,酉长的承诺不是 最初的源点,它是一个目标点,也就是说点到点的指向方向是由 无替代品的点 逐渐指向到 酉长的承诺1点,题意说明的是一个回溯的过程,因此可以定义一个最初的源点0点,它到其他各点的权值就是每个物品的原价,而点A到点B的权值 就是 物品B在有第A号替代品情况下的优惠价
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int inf=0x3f3f3f3f;
int map[110][110];//物品i在有第t号替代品情况下的优惠价map[t][i],当t=0时说明i无替代品,此时为原价
int vis[110];
int dis[110];//最初的源点0到任意点i的最初距离(权值),相当于每个物品的原价
int rank[110];//第i号物品主人的等级
int rep[110];//第i号物品的替代品总数
int m,n//M为等级差,N为物品数目
int dijkstra()
{
int i,j,k;
int min;
for(i=1; i<=n; i++)
dis[i]=map[0][i];//物品i在有第t号替代品情况下的优惠价,即点t到点i的权值
for(i=1; i<=n; i++) {//由于1点是目标点,因此最坏的打算是进行n次寻找源点到其他点的最短路,并合并这两点(不再访问相当于合并了)
min=inf;
for(j=1; j<=n; j++) {
if(!vis[j]&&dis[j]<min) {//在未访问的点中,寻找最短的一条
min=dis[j];
k=j;
}
}
if(min==inf)
break;
vis[k]=1;
for(j=1; j<=n; j++) {
if(!vis[j]&&map[k][j]>0&&dis[j]>dis[k]+map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
return dis[1];//返回当前次交易后目标点1在等级lv[i]约束下的最短距离
}
int main()
{
int i,j;
int t,u;
int low_price,max_rank,min_price;
memset(map,0,sizeof(map));
memset(rank,0,sizeof(rank));
memset(rep,0,sizeof(rep));
memset(dis,inf,sizeof(dis));
memset(vis,0,sizeof(vis));
scanf("%d %d",&m,&n);
for(i=1; i<=n; i++) {
scanf("%d %d %d",&map[0][i],&rank[i],&rep[i]);
for(j=1; j<=rep[i]; j++) {
scanf("%d %d",&t,&u);
map[t][i]=u;//物品i在有第t号替代品情况下的优惠价,即点t到点i的权值
}
}
min_price=inf;
for(i=1;i<=n;i++){
max_rank=rank[i];//把当前物品的等级暂时看做最高等级
for(j=1;j<=n;j++){//遍历其他各点
if(rank[j]>max_rank||max_rank-rank[j]>m) //当其它物品j的等级比当前物品高(保证单向性),或者两者等级之差超出限制M时
vis[j]=1;//物品j则强制定义为“已访问”状态,不参与后续操作
else
vis[j]=0;//否则物品j定义为“未访问”状态,参与后续操作
}
low_price=dijkstra();//记录当前次交易后目标点1在等级lv[i]约束下的最短距离(最少价格)
if(min_price>low_price)//寻找各次交易后的最少价格,最终确认最少价格
min_price=low_price;
}
printf("%d\n",min_price);
return 0;
}
标签:
原文地址:http://blog.csdn.net/u013486414/article/details/42550223