【POJ 1724】Roads (限制最短路)

传送门

    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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值