传送门
Roads
题意:给出一张n个节点的图,每条边有长度与花费两种权值。求在花费C内从点1到点n的最短路径。
I think
有限制条件的最短路。Dijkstra将满足不超过花费的被更新点加入优先队列 ,在队列里按照长度排序。
Code
#include<cstdio>
#include<queue>
using namespace std;
const int sn = 1e3+5;
const int sm = 1e4+5;
struct Nd {
int d,c,id;
bool operator < (const Nd&a) const {
return (a.d!=d)?(a.d<d):(a.c<c);
}
};
int C,N,M,Ans,tot;
int to[sm],nxt[sm],w[sm][2],hd[sn];
void Add(int u,int v,int ca,int cb) {
to[++tot]=v,nxt[tot]=hd[u],hd[u]=tot;
w[tot][0]=ca,w[tot][1]=cb;
}
void Dijkstra(int St) {
priority_queue<Nd>Q;
Nd t,q;
q = (Nd) { 0,0,St }; Q.push(q);
while(!Q.empty()) {
t = Q.top(),Q.pop();
if(t.id==N) { Ans=t.d;return;}
for(int i=hd[t.id];i;i=nxt[i])
if(w[i][1]+t.c<=C) {
q = (Nd) { w[i][0]+t.d,w[i][1]+t.c,to[i] };
Q.push(q);
}
}
}
int main() {
scanf("%d%d%d",&C,&N,&M);
int u,v,ca,cb;
for(int i=1;i<=M;++i) {
scanf("%d%d%d%d",&u,&v,&ca,&cb);
Add(u,v,ca,cb);
}
Dijkstra(1);
printf("%d\n",Ans);
return 0;
}