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;}


原创粉丝点击