poj1724【最短路】

来源:互联网 发布:淘宝抠图出来衣服 编辑:程序博客网 时间:2024/05/22 16:51

题意:
给出n个城市,然后给出m条单向路,给出了每条路的距离和花费,问一个人有k coins,在不超过money的情况下从1到n最短路径路径。
思路:
我相信很多人在上面那道题的影响下,肯定会想想,在保证最短路的前提下维护下最小花费?还是保证最小花费下维护一个最短路?这样两个想法的bug都非常明显啊。第一个,那是大错特错了,人家首要给你的条件满足<=k,你还抱住最短路长度不放,给你wa是同情。第二个,有个bug就是他是最小花费,可能存在一条路的花费大于最小花费但是他的路长度才是最短路,给你wa也不冤啊。

//#include <bits/stdc++.h>#include<iostream>#include<cstdio>#include<string.h>#include<math.h>#include<queue>#include<algorithm>using namespace std;typedef long long LL;typedef unsigned long long ULL;const double eps=1e-6;const double pi=acos(-1.0);const int mod=998244353;const int INF=0x3f3f3f3f;const int N=1e2+10;struct asd{    int to;    int w;    int c;    int next;};asd q[N*N*2];int tol,head[N*N*2];bool vis[N];int used[N];int n,k;void add(int a,int b,int c,int d){    q[tol].to=b;    q[tol].w=c;    q[tol].c=d;    q[tol].next=head[a];    head[a]=tol++;}struct node{    int id,dis,time;    friend bool operator<(node a,node b)    {        if(a.dis==b.dis)            return a.time>b.time;        return a.dis>b.dis;    }};int spfa(int s,int t){    priority_queue<node>e;    node u;    u.id=s;    u.dis=u.time=0;    e.push(u);    while(!e.empty())    {        u=e.top();        e.pop();        if(u.id==n){            return u.dis;        }        for(int i=head[u.id];i!=-1;i=q[i].next)        {            node v;            v.id=q[i].to;            if(u.time+q[i].c<=k){                v.dis=u.dis+q[i].w;                v.time=u.time+q[i].c;                e.push(v);            }        }    }    return -1;}int main(){    int m;    cin>>k;    cin>>n;    cin>>m;    tol=0;    memset(head,-1,sizeof(head));    for(int i=0;i<m;i++){        int a,b,c,d;        scanf("%d%d%d%d",&a,&b,&c,&d);        add(a,b,c,d);    }    int ans=spfa(1,n);    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击