poj 1724 ROADS
来源:互联网 发布:2017熊片数据库 编辑:程序博客网 时间:2024/04/30 04:09
#include <iostream>#include <queue>#include <cstdio>#include <cstring>#include <queue>using namespace std;int vist[105];int head[10005];struct node{ int from; int to; int next; int len; int c;} s[10005];struct Node{ int l, v, in; friend bool operator<(const Node &x, const Node &y) { if(x.l != y.l) { return x.l > y.l; } else { return x.v > y.v; } }};int ans;int n, m, s1;int cnt;void add(int a, int b, int d, int e){ s[cnt].from = a; s[cnt].to = b; s[cnt].len = d; s[cnt].next = head[a]; s[cnt].c = e; head[a] = cnt; cnt++;}void bfs(){ priority_queue<Node>que; Node cur, next; cur.l = 0; cur.v = 0; cur.in = 1; que.push(cur); while(!que.empty()) { cur = que.top(); que.pop(); if(cur.in == n) { ans = cur.l; break; } int now = cur.in; for(int i = head[now]; i != -1; i = s[i].next) { int u = s[i].to; int temp = s[i].len + cur.l; int mi = s[i].c + cur.v; if(mi <= s1) //只要有硬币就可以继续查找, { next.in = u; next.l = temp; next.v = mi; que.push(next); } } }}int main(){ int a, b, d, e; while(scanf("%d", &s1) != EOF) { scanf("%d", &n); scanf("%d", &m); cnt = 0; memset(head, -1, sizeof(head)); for(int i = 1; i <= m; i++) { scanf("%d%d%d%d", &a, &b, &d, &e); add(a, b, d, e); } memset(vist, 0, sizeof(vist)); ans = -1; bfs(); printf("%d\n", ans); } return 0;}