POJ1062—婚姻买卖
来源:互联网 发布:ae软件手机版 编辑:程序博客网 时间:2024/06/09 19:09
求有限制的最短路,重点在于等级限制。处理的方法是:将一路径上的最大、最小等级记录下来,每次取最大最小等级差在允许的范围内的点加入。这只要申请几个数组就可以办到,很简单的。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=102;const int inf=100000000;int m,n,mincost;bool visit[maxn];int dist[maxn],maxl[maxn],minl[maxn],w[maxn][maxn];struct node{ int value; int loc; int num;}point[maxn];bool check(int a,int b){ if(abs(a-b)<=m) return true; else return false;}void Dijkstra(){ int i,j,k,minv; for(i=1;i<=n;i++) dist[i]=inf; dist[1]=0; k=1; for(i=1;i<=n;i++) { minv=inf; for(j=1;j<=n;j++) if(dist[j]<minv && !visit[j] && check(maxl[j],minl[j])) { minv=dist[j]; k=j; } visit[k]=true; //访问完这个结点 mincost=min(mincost,point[k].value+dist[k]); //买目标结点的物品要钱 for(j=1;j<=n;j++) if(!visit[j] && w[k][j]!=-1 && dist[k]+w[k][j]<dist[j]) { dist[j]=dist[k]+w[k][j]; maxl[j]=max(maxl[k],point[j].loc); minl[j]=min(minl[k],point[j].loc); } }}int main(){ int i,j,a,b; while(scanf("%d%d",&m,&n)!=EOF) { memset(w,-1,sizeof(w)); memset(visit,0,sizeof(visit)); for(i=1;i<=n;i++) { scanf("%d%d%d",&point[i].value,&point[i].loc,&point[i].num); for(j=1;j<=point[i].num;j++) { scanf("%d%d",&a,&b); //物品编号、价格 w[i][a]=b; //有向图的最短路径 } } mincost=point[1].value; maxl[1]=point[1].loc; minl[1]=point[1].loc; Dijkstra(); printf("%d\n",mincost); } return 0;}
- POJ1062—婚姻买卖
- poj1062
- poj1062
- poj1062
- POJ1062
- poj1062
- poj1062
- poj1062
- poj1062
- POJ1062
- POJ1062
- poj1062
- poj1062
- poj1062
- poj1062
- poj1062
- POJ1062
- poj1062
- CGAL在VS2010安装
- 结构体之位域(位段)
- 个人博客转到 http://blog.csdn.net/synoinfotech 谢谢各位的关注!
- img图片在ie下有有空隙
- erlang内置大数据量数据库 ets,dets 初窥 .
- POJ1062—婚姻买卖
- Android中如何查找内存泄露
- WINCE TTS语音合成引擎
- HDU-1075(字典树入门)
- 最好用的JS图像无缝滚动脚本
- 苹果VS谷歌,开战了?
- VC/MFC 操作ini文件
- telnet
- POJ 1639(K度限制的生成树)