【POJ1724】ROADS 某邪恶最短路

来源:互联网 发布:纵横家 知大局 编辑:程序博客网 时间:2024/05/22 12:25

题意:p,n,m,然后m行表示入点出点长度花费。

      求花费在p以内的最短路。

我写的一定不是pqdij!一定不是!一定是dfs!


题解:做一个pq优化的dij,然后看每次跑出来的路的花费是否<=p。

完事。额,注意是单向边。

看代码!快看我的水代码!

#include <set>#include <list>#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 1005#define M 100005using namespace std;struct KSD{int v,len,cost,next;}e[M<<1];int head[N],cnt;void add(int u,int v,int len,int cost){cnt++;e[cnt].v=v;e[cnt].len=len;e[cnt].cost=cost;e[cnt].next=head[u];head[u]=cnt;}int n,m,p;struct Lux{int f,c,v;bool operator < (const Lux &a)const{return f>a.f;}Lux(int _f,int _c,int _v):f(_f),c(_c),v(_v){}Lux(){}};priority_queue<Lux>pq;int dfs(int s,int t){int i,u;pq.push(Lux(0,0,s));while(!pq.empty()){Lux U=pq.top();pq.pop();u=U.v;if(u==t)return U.f;for(i=head[u];i;i=e[i].next){if(U.c+e[i].cost<=p)pq.push(Lux(U.f+e[i].len,U.c+e[i].cost,e[i].v));}}return -1;}int main(){//freopen("test.in","r",stdin);int i,a,b,c,d;scanf("%d%d%d",&p,&n,&m);for(i=1;i<=m;i++){scanf("%d%d%d%d",&a,&b,&c,&d);add(a,b,c,d);//add(b,a,c,d);}printf("%d\n",dfs(1,n));return 0;}


0 0