http://poj.org/problem?id=1062

本文详细阐述了一种利用Dijkstra算法与枚举法相结合的方法,用于求解从某一点到其他所有点的最短路径,同时满足路径上点与点之间的等级差不超过给定值n的条件。通过依次扫描特定区间,实现高效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dijstra+枚举法,,,

题意中文不再说明了,,,,,

解法:求一点到其他所有点的最短路径(还要加上终点的pri[],在一条路径上点与点之间的等级差不能超过n,

扫描区间因为每条路径都要经过点1,所以依次扫描区间[lev[1]-n,leve[1]]......[lev[1],lev[1]+n]

代码:

#include<iostream> #include<algorithm> #include<string.h> #define N 1001 #define M 111111111 using namespace std; int map[N][N],G[N][N],dis[N],lev[N],pre[N]; int n,m,k; bool visit[N]; void dijstra(int a) { memset(visit,false,sizeof(visit)); for(int i=1;i<=m;++i) dis[i]=(a==i?0:M); for(int i=1;i<=m;++i) { int minx=M; for(int j=1;j<=m;++j) if(!visit[j]&&minx>dis[j]) minx=dis[a=j]; visit[a]=true; for(int j=1;j<=m;++j) if(!visit[j]) dis[j]=min(dis[j],dis[a]+map[a][j]); } } void sift(int l,int r)//扫描两端的等级不在1-r上的把它赋为M。 { for(int i=1;i<=m;++i) for(int j=1;j<=m;++j) if(lev[i]>=l&&lev[i]<=r&&lev[j]>=l&&lev[j]<=r) map[i][j]=G[i][j]; else map[i][j]=M; } int pro() { int minx=M; for(int i=lev[1]-n;i<=lev[1];++i) { sift(i,i+n);//依次扫描。 dijstra(1); for(int j=1;j<=m;++j) minx=min(minx,dis[j]+pre[j]); } return minx; } int main() { cin>>n>>m; for(int i=0;i<=m;i++) for(int j=0;j<=m;j++) { G[i][j]=M; map[i][j]=M; } for(int i=1;i<=m;++i) { cin>>pre[i]>>lev[i]>>k; for(int j=1;j<=k;++j) { int a,b; cin>>a>>b; G[i][a]=b; } } cout<<pro()<<endl; return 0; //system("pause"); }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值