http://poj.org/problem?id=1724
#include<iostream> #include<queue> #define INF 1000000000 #define MAXR 105 using namespace std; int E,N,M,s,d,l,t,dis[MAXR],i; struct Node { int d,l,t; friend bool operator<(const Node &a,const Node &b) { if(a.l==b.l) return a.t>b.t; return a.l>b.l; } }Edge,temp; priority_queue<Node>Q; vector<Node>map[MAXR]; int dijkstra() { Edge.d=1; Edge.l=0; Edge.t=0; Q.push(Edge); dis[1]=0; for(i=2;i<=N;i++) dis[i]=INF; while(!Q.empty()) { Edge=Q.top(); Q.pop(); dis[Edge.d]=Edge.l; if(Edge.d==N) return dis[N]; for(i=0;i<map[Edge.d].size();i++) { temp.t=Edge.t+map[Edge.d][i].t; if(temp.t<=E) { temp.d=map[Edge.d][i].d; temp.l=Edge.l+map[Edge.d][i].l; Q.push(temp); } } } if(dis[N]!=INF) return dis[N]; return -1; } int main(void) { cin>>E>>N>>M; for(i=0;i<M;i++) { cin>>s>>d; cin>>l>>t; Edge.d=d; Edge.l=l; Edge.t=t; map[s].push_back(Edge); } cout<<dijkstra()<<endl; return 0; }