题目大意
- 编号为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)
输出格式
算法分析
- 裸的最短路板子
- 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;
}