pku3635有一定大小的油箱从S到T所需最少的money
2011-08-06 15:45
134 查看
题意:现有N个点(n<=1000),m条边(m<=10000),在每个点都可以加油,告诉你每个点加油的单价,现在有一些询问,每个询问有油箱大小,始点,终点。输出每个询问的最小费用,不可能输出impossible.
注意:使用优先队列(排序也是一样,反正用到堆的)时,注意你比较的值插入队列后就不要改变,因为如果改变了,但它在队列中的位置仍不变,那么就会不对应,导致出错。
分析:对于每个查询,有状态mo[i][j]在i城市还剩油j所用的最少的钱
注意:使用优先队列(排序也是一样,反正用到堆的)时,注意你比较的值插入队列后就不要改变,因为如果改变了,但它在队列中的位置仍不变,那么就会不对应,导致出错。
分析:对于每个查询,有状态mo[i][j]在i城市还剩油j所用的最少的钱
#include<stdio.h> #include<iostream> #include<vector> #include<queue> #include<algorithm> using namespace std; const int maxn=1100; const int maxm=11000; const int maxc=110; const int maxint=0x3fffffff; struct point { int u,v,w,c; }p0,p1; vector<point> e[maxn]; int n,c,s,t,mo[maxn][maxc],a[maxn]; bool operator >(point a,point b) { return a.w>b.w;//这里不能用mo[a.v][a.c]>mo[b.v][b.c], } priority_queue <point,vector<point>,greater<point> >p; void S() { int i,j,k; bool tag; while(!p.empty()) p.pop(); for(i=0;i<n;i++) for(j=0;j<=c;j++) mo[i][j]=maxint; mo[s][0]=0; p0.v=s; p0.c=0; p0.w=0; p.push(p0); tag=false; while(!p.empty()) { p0=p.top(); p.pop(); if(p0.w!=mo[p0.v][p0.c])//费用不是最少时,说明前面已经有最少的往后更新了,所以没用了 continue; j=p0.v; if(j==t) { tag=true; printf("%d\n",p0.w); break; } if(p0.c+1<=c&&mo[j][p0.c+1]>mo[j][p0.c]+a[j]) { mo[j][p0.c+1]=mo[j][p0.c]+a[j]; p1.v=j,p1.c=p0.c+1,p1.w=mo[j][p1.c]; p.push(p1); } for(i=0;i<e[j].size();i++) { if(p0.c<e[j][i].w) continue; k=e[j][i].v; if(mo[k][p0.c-e[j][i].w]>mo[j][p0.c]) { mo[k][p0.c-e[j][i].w]=mo[j][p0.c]; p1.v=k,p1.c=p0.c-e[j][i].w; p1.w=mo[k][p1.c]; p.push(p1); } } } if(!tag) printf("impossible\n"); } int main() { int m,q,i; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { e[i].clear(); scanf("%d",&a[i]); } for(i=0;i<m;i++) { scanf("%d%d%d",&p0.u,&p0.v,&p0.w); e[p0.u].push_back(p0); swap(p0.u,p0.v); e[p0.u].push_back(p0); } scanf("%d",&q); while(q--) { scanf("%d%d%d",&c,&s,&t); S(); } } return 0; }
相关文章推荐
- 一次生日Party可能有p人或者q人参加,现准备有一个大蛋糕.问最少要将蛋糕切成多少块(每块大小不一定相等),才能使p人或者q人出席的任何一种情况,都能平均将蛋糕分食
- 数据结构与算法——在一定范围内求最少标记点
- Java对象的内存布局以及对象所需内存大小计算详解
- hdu 4544 每箭有一定消耗和伤害用来杀兔子,问杀完兔子最少消耗
- 自定义RatingBar控件,实现可自定义星星(或项目所需图片)的宽高,告别使用warp_content导致控件大小不可控
- (字符串的映射与匹配7.3.13)UVA 10152 ShellSort(将初始序列转化成目标序列所需的最少次数,前提条件是:每一个元素只能移动栈顶)
- 栈的理解以及如何计算程序所需栈的大小并在IAR中设置栈
- 如何让大小一定的span能够包含“容不下”的内容
- Java对象的内存布局以及对象所需内存大小计算详解
- cxf做webservice所需最少jar包
- ros_opencv按下键p获取一张大小一定的kinect图像并传送整型的imageNumber话题
- Hibernate所需最少jar包
- 二分法查找和快速排序 二分法是分治算法的一种特殊形式,利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是查找数据时经常采用的一种有
- 同时寻找最大数和最小数的最优算法以及寻找最大的两个数所需的最少比较次数
- 针对格式文件,Python读取一定大小的文件内容
- 用python pulp的线性规划方法计算满足营养所需的最少食物
- hdu4003 2011大连赛区网赛1003一棵树,K个机器人遍历所有结点所需的最少权值和
- 用font-spider释放字体文件大小,只取所需!
- 超好用的移动端布局自适应大小rem判断js文件及超过一定高度回到顶部按钮代码
- linux创建一定大小文件命令--dd