POJ - 1062 昂贵的聘礼(Dijkstra)
2016-05-01 23:11
363 查看
题目链接:http://poj.org/problem?id=1062
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#define N 105
#define MAX 0x3f3f3f3f
using namespace std;
/****************************************************************************************************************
题意:题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)
替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1
思路:
1,dijkstra算法
2,如何建图:
a,以每件物品和它的替代品建图(注意等级差必须在规定范围内)
b,以每个入度为0的点为起点,以第一个点(酋长的物品)为终点,搜索最短路
c,如何做到2呢?将所有点和一个新结点关联(程序中0为这个结点),初始化边为每个结点的花费
3,建图结束后基本上直接套板子就可以了,起点 = 0,终点 = 1,搜索找到最短边
****************************************************************************************************************/
struct Goods
{
int p,l,v;
int num
;
int val
;
}goods
;
int Map
;
int visit
,dist
;
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;
}
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#define N 105
#define MAX 0x3f3f3f3f
using namespace std;
/****************************************************************************************************************
题意:题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)
替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1
思路:
1,dijkstra算法
2,如何建图:
a,以每件物品和它的替代品建图(注意等级差必须在规定范围内)
b,以每个入度为0的点为起点,以第一个点(酋长的物品)为终点,搜索最短路
c,如何做到2呢?将所有点和一个新结点关联(程序中0为这个结点),初始化边为每个结点的花费
3,建图结束后基本上直接套板子就可以了,起点 = 0,终点 = 1,搜索找到最短边
****************************************************************************************************************/
struct Goods
{
int p,l,v;
int num
;
int val
;
}goods
;
int Map
;
int visit
,dist
;
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;
}
相关文章推荐
- opencv异常提示之 (channels() == CV_MAT_CN(dtype)) in copyTo (暂未解决,提供源码)
- 20145310《Java程序设计》第4次实验报告
- 20145310 《Java程序设计》第9周学习总结
- codeforces 667A A. Pouring Rain(水题)
- [Javascript] Add a browser build to an npm module
- 福斯数据服务平台产品白皮书
- PHP无法编译undefined reference to `libiconv_open
- 20145230《java学习笔记》第九周学习总结
- 第八周:进程的切换和系统的一般执行过程
- php关于数字格式方法收集
- eclipse启动超时错误
- 团队项目意见
- 智能手表ticwatch穿戴体验
- stl--分析空间配置器及源码实现
- spl3 排序 参照我写的 学生管理 sp3 中
- 冲刺第八天
- java.util.concurrent BlockingQueue
- 数组和集合
- 解决虚拟机中Ubuntu中的无法上网的问题
- jquery对象访问 介绍及如何使用