POJ - 1062 昂贵的聘礼(Dijkstra)
来源:互联网 发布:php curl 获取图片 编辑:程序博客网 时间:2024/05/17 02:58
题目链接:http://poj.org/problem?id=1062
#include <iostream>#include <string>#include <cstring>#include <cmath>#define N 105#define MAX 0x3f3f3f3fusing namespace std;/**************************************************************************************************************** 题意:题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个) 替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1 思路: 1,dijkstra算法 2,如何建图: a,以每件物品和它的替代品建图(注意等级差必须在规定范围内) b,以每个入度为0的点为起点,以第一个点(酋长的物品)为终点,搜索最短路 c,如何做到2呢?将所有点和一个新结点关联(程序中0为这个结点),初始化边为每个结点的花费 3,建图结束后基本上直接套板子就可以了,起点 = 0,终点 = 1,搜索找到最短边****************************************************************************************************************/struct Goods{ int p,l,v; int num[N]; int val[N];}goods[N];int Map[N][N];int visit[N],dist[N];int m,n;int dijkstra(int st){ int leval=goods[st].l; memset(dist,MAX,sizeof(dist)); memset(visit,0,sizeof(visit)); for(int i = 0;i <= n;i ++) if(goods[i].l - leval <= m && goods[i].l >= leval) dist[i]=Map[0][i]; dist[0]=0; visit[0]=1; for(int i = 0;i < n;i ++){ int id=MAX,ans=MAX; for(int j = 0;j <= n;j ++) if(!visit[j] && dist[j] < ans) ans=dist[id=j]; if(id == MAX) break; visit[id]=1; for(int j = 0;j <= n;j ++) if(!visit[j] && goods[j].l - leval <= m && goods[j].l >= leval) if(dist[j] > dist[id]+Map[id][j]) dist[j]=dist[id]+Map[id][j]; } return dist[1];}int main(){ while(cin>>m>>n) { memset(Map,MAX,sizeof(Map)); memset(goods,0,sizeof(goods)); for(int i = 1;i <= n;i ++){ cin>>goods[i].p>>goods[i].l>>goods[i].v; for(int j = 0;j < goods[i].v;j ++) cin>>goods[i].num[j]>>goods[i].val[j]; Map[0][i]=goods[i].p; //建立新结点实现 2.c } for(int i = 1;i <= n;i ++) for(int j = 0;j < goods[i].v;j ++) if(fabs(goods[goods[i].num[j]].l - goods[i].l) <= m && goods[i].val[j] < Map[goods[i].num[j]][i]) Map[goods[i].num[j]][i]=goods[i].val[j]; /*for(int i = 0;i <= n;i ++){ for(int j = 0;j <= n;j ++) cout<<Map[i][j]<<" "; cout<<endl; }*/ int ansN=MAX; for(int i = 1;i <= n;i ++){ //搜索每种物品的替代品情况,找到花费最小的 int temp=dijkstra(i); if(temp < ansN) ansN=temp; } cout<<ansN<<endl; } return 0;}
0 0
- POJ 1062 昂贵的聘礼(dijkstra)
- POJ 1062 昂贵的聘礼(dijkstra)
- POJ 1062 昂贵的聘礼 (dijkstra)
- POJ 1062 昂贵的聘礼(dijkstra)
- POJ - 1062 昂贵的聘礼(Dijkstra)
- poj 1062 昂贵的聘礼 (dijkstra)
- POJ 1062 昂贵的聘礼 Dijkstra
- POJ 1062 昂贵的聘礼 Dijkstra
- poj 1062 昂贵的聘礼 dijkstra
- POJ 1062昂贵的聘礼 (建图+dijkstra)
- POJ 1062 昂贵的聘礼 Dijkstra算法
- poj 1062 昂贵的聘礼 dijkstra
- POJ 1062 昂贵的聘礼(Dijkstra)
- 昂贵的聘礼 poj 1062 Dijkstra
- poj 1062 昂贵的聘礼 [dijkstra]
- POJ 1062 昂贵的聘礼(dijkstra)
- Dijkstra-POJ-1062-昂贵的聘礼
- poj 1062 昂贵的聘礼 【枚举 + dijkstra】
- 四、String类的转换功能
- spl3 排序 参照我写的 学生管理 sp3 中
- eclipse启动超时错误
- 奶牛xor--nkoi1873
- 专题三 第七题
- POJ - 1062 昂贵的聘礼(Dijkstra)
- Spring容器(四)
- leetcode——139——Word Break
- tableView注册cell的三种方式
- POJ - 1125 Stockbroker Grapevine(Floyd)
- Android面试题——ListView(一)
- Bootstrap 实现输入框中的 x 按钮删除文本值
- 例题9-1 UVA - 1025 A Spy in the Metro 城市里的间谍(DP)
- java中Iterator遍历时的删除问题