题目大意:有两个权值的最短路问题,要求满足费用不超过一定限度的情况下的最短路。
思路:正常的SPFA加一个小判断,就是当费用高于预期费用的时候不入队,顺便加一个pq吧。
CODE:
#include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 100005 #define INF 0x3f3f3f3f using namespace std; int money,points,edges; int head[MAX],total; int next[MAX],aim[MAX],length[MAX],cost[MAX]; struct Complex{ int pos,len,c; Complex(int _,int __,int ___):pos(_),len(__),c(___) {} bool operator <(const Complex &a)const { return len > a.len; } }; inline void Add(int x,int y,int len,int c) { next[++total] = head[x]; aim[total] = y; length[total] = len; cost[total] = c; head[x] = total; } int HeapSPFA() { static priority_queue<Complex> q; q.push(Complex(1,0,0)); while(!q.empty()) { Complex now = q.top(); q.pop(); int x = now.pos,len = now.len,c = now.c; if(x == points) return len; for(int i = head[x]; i; i = next[i]) if(c + cost[i] <= money) q.push(Complex(aim[i],len + length[i],c + cost[i])); } return -1; } int main() { cin >> money >> points >> edges; for(int x,y,z,l,i = 1; i <= edges; ++i) { scanf("%d%d%d%d",&x,&y,&z,&l); Add(x,y,z,l); } cout << HeapSPFA() << endl; return 0; }
时间: 2024-10-07 07:36:29