poj1062 昂贵的聘礼 dijkstra
2016-01-18 20:40
381 查看
题意:N件物品分别有自己的价值及地位,有些可以被另一件及一个优惠价来替换,选择出的任意两件之间的地位差不超过m,求第一件的最低价;
最开始想用dfs,无情的爆栈了;
强行构图,以每件的价值为点,替换的优惠价为边。遍历每一件物品,把当前物品作为的最低地位(关键),以此选择出符合的点和边,用dijkstra,选出当前情况下第一件物品的最低价,最终比较出所有情况下第一件物品的最低价;
最开始想用dfs,无情的爆栈了;
强行构图,以每件的价值为点,替换的优惠价为边。遍历每一件物品,把当前物品作为的最低地位(关键),以此选择出符合的点和边,用dijkstra,选出当前情况下第一件物品的最低价,最终比较出所有情况下第一件物品的最低价;
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define N 110 #define INF 0x7ffffff using namespace std; int d ,price ,pos ,v ,e ,n,m; int dijkstra() { for(int i=1;i<=n;i++) d[i]=price[i]; for(int i=0;i<n;i++) { int mmin=INF,t=-1; for(int j=1;j<=n;j++) if(!v[j]&&d[j]<mmin) mmin=d[t=j]; if(t==-1) break; v[t]=1; for(int j=1;j<n;j++) if(!v[j]&&d[j]>d[t]+e[t][j]) d[j]=d[t]+e[t][j]; } return d[1]; } int main() { while(~scanf("%d%d",&m,&n)) { for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) e[i][j]=INF;//inti for(int i=1;i<=n;i++) { int x; scanf("%d%d%d",&price[i],&pos[i],&x); for(int j=0;j<x;j++) { int val,t; scanf("%d%d",&t,&val); e[t][i]=val; } } int _min=INF; for(int i=1;i<=n;i++) { memset(v,0,sizeof(v)); for(int j=1;j<=n;j++) if(pos[j]<pos[i]||pos[j]-pos[i]>m) v[j]=1; _min=min(dijkstra(),_min); } cout<<_min<<endl; } }
相关文章推荐
- JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据
- JAVA随机数之多种方法从给定范围内随机N个不重复数
- 作品第三课----输入两个数字,比较大小
- POJ 3616 Milking Time
- 批处理文件的@echo off是什么意思?
- ubuntu重新安装所有的package
- 配置文件关联源码
- javaweb学习总结(三十四)——使用JDBC处理MySQL大数据
- K-means算法的介绍
- 三列等高布局
- 详解Mac上aria2的配置
- 一个伪码农的自白(一)
- FINT6线性方程与最大公因数
- javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD
- javaweb学习总结(三十二)——JDBC学习入门
- android从零单排之设置圆边按钮
- 多机作业排序问题-约翰逊算法和帕尔默法求最优解
- 线程同步
- MVC4 使用概述
- iOS Xcode个人常用插件