zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    ButterKnife 原理解析
    有关java之反射的使用
    Integer 与 int 中的 ==
    下拉框、多选框、单选框 通过TagHelper绑定数据
    动态构建视图表单
    添加我的应用中的后台图标
    标准服务接口示例代码
    .net Core下的 常用方法
    使用Redirect跳转
    标准表单提交示例代码
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934419.html
Copyright © 2011-2022 走看看