标签:
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