乘车路线 (二维最短路)

题目大意

  • 编号为1~N 的 N 座城镇用若干仅供单向行驶的道路相连,每条道路上均有两个参数:道路长度(length)和在该条道路上行驶的费用(cost)。
  • BOB准备从城镇 1 出发到达城镇 N ,但他目前只有 W 的钱,为此,你需要帮助他寻找一条从城镇 1 到城镇 N 在他能支付的前提下的一条最短路线

输入格式

  • W N M(N为城镇数目,2<=N<=100,M 为道路条数,1<=M<=10000,W 为钱的数目,0<=W<=1000)
  • 随后的 M 行每行为一条道路的信息,包含 4 个数值(u,v,w,cost),表示从城镇 u 到 v 有一条长度为 w 的单向道路,经过这条道路需要花费 cost 。(1<=u,v<=N,1<=w<=100,0<=cost<=100)

输出格式

  • 输出最短长度,若无解,则输出“NO”;

算法分析

  • 裸的最短路板子
  • emm 裸的二维最短路板子
  • 真的是个板子博主不会给解释的
  • 你还看啥呢
  • 要代码????

代码展示

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
int cnt,head[maxn],k;
int dis[maxn][1005];
int vis[maxn][1005];
int ans = 0x3f3f3f3f;

struct node{
	int next,to,dis,cost;
}a[maxn << 4];

struct Node{
	int to,cost;
	Node(int x,int y){
		to = x;
		cost = y;
	}	
};

void add(int x,int y,int z,int v){ a[++cnt].to = y; a[cnt].next = head[x]; a[cnt].dis = z; a[cnt].cost = v; head[x] = cnt;}//加边

queue<Node> q;

void spfa(int s){//把每个都加一维状态表示花费多少钱
	memset(dis,0x3f,sizeof(dis));
	dis[s][0] = 0;vis[s][0] = 1;
	q.push(Node(s,0));
	while(!q.empty()){
		int u = q.front().to;
		int val = q.front().cost;
		q.pop();
		vis[u][val] = 0;
		for(int i = head[u];i;i = a[i].next){
			int v = a[i].to;
			if(val + a[i].cost > k)continue;//剪枝
			if(dis[v][val + a[i].cost] > dis[u][val] + a[i].dis){
				dis[v][val + a[i].cost] = dis[u][val] + a[i].dis;
				if(!vis[v][val + a[i].cost]){
					vis[v][val + a[i].cost] = 1;
					q.push(Node(v,val + a[i].cost));
				}
			}
		}
	}
}

int main(){
	int n,m;scanf("%d%d%d",&k,&n,&m);
	for(int i = 1;i <= m;++i){int x,y,z,v;scanf("%d%d%d%d",&x,&y,&z,&v);add(x,y,z,v);}
	spfa(1);
	for(int i = 0;i <= k;++i)ans = min(ans,dis[n][i]);
	if(ans == 0x3f3f3f3f){printf("NO
");return 0;}
	printf("%d",ans);
	return 0;
}
如初见 与初见
原文地址:https://www.cnblogs.com/HISKrrr/p/13337540.html