poj1724【最短路】

题意:
给出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
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934419.html