zoukankan      html  css  js  c++  java
  • POJ 1724 (分层图最短路)

    ### POJ 1724 题目链接 ###

    题目大意:

    给你 N 个点 ,M 条有向路,走每条路需要花费 C 元,这段路的长度为 L 。

    给你 K 元,问你能否从 1 走到 N 点且花费不超过 K 元。如果可以,输出出最短距离,否则输出 -1 。

    显然分层图最短路,这里 dist[i][j] 表示从 1 到 i 点 且 所剩钱数为 j 时的最短路,然后跑一遍 dijkstra 即可。

    PS:在优先队列先到达 N 点的即为答案,可以直接返回,不需要等队列走完再 O(N)找最小值,时间会很快(这里还是遍历了一遍 = =)

    代码如下: 

    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<queue>
    #define inf 0x3f3f3f3f
    #define maxn 308
    using namespace std;
    int K,N,M,cnt;
    int head[maxn],ans;
    bool vis[maxn][10008];
    int dist[maxn][10008];
    struct Edge
    {
        int to;
        int val;
        int m;
        int next;
    }edge[maxn*maxn];
    struct Node
    {
        int x;
        int k;
        int val;
        Node(){};
        Node(int _x,int _k,int _val){
            x=_x,k=_k,val=_val;
        }
        bool operator < (const Node a) const{
            return val>a.val;
        }
     };
    inline void add(int u,int v,int val,int m)
    {
        edge[++cnt].to=v;
        edge[cnt].val=val;
        edge[cnt].m=m;
        edge[cnt].next=head[u];
        head[u]=cnt;
        return;
    }
    void dijkstra()
    {
        priority_queue<Node> q;
        while(!q.empty()) q.pop();
        for(int i=1;i<=N;i++){
            for(int j=0;j<=K;j++){
                dist[i][j]=inf;
            }
        }
        q.push(Node(1,K,0));
        dist[1][K]=0;
        while(!q.empty())
        {
            int u=q.top().x,k=q.top().k;
            q.pop(); // 这里可以直接 if( u == N) ans = q.top().val ,即为答案
            if(vis[u][k]) continue;
            vis[u][k]=true;
            for(int i=head[u];i;i=edge[i].next){
                int v=edge[i].to;
                if(k>=edge[i].m){
                    if(dist[v][k-edge[i].m]>dist[u][k]+edge[i].val){
                        dist[v][k-edge[i].m]=dist[u][k]+edge[i].val;
                        q.push(Node(v,k-edge[i].m,dist[v][k-edge[i].m]));
                    }
                }
            }
        }
        return;
    }
    int main()
    {
        //freopen("test.in","r",stdin);
        //freopen("test.out","w",stdout);
        scanf("%d%d%d",&K,&N,&M);
        int A,B,C,D;
        while(M--)
        {
            scanf("%d%d%d%d",&A,&B,&C,&D);
            add(A,B,C,D);
        }
        ans=inf;
        dijkstra();
        for(int i=0;i<=K;i++){
            ans=min(ans,dist[N][i]);
        }
        if(ans==inf) printf("-1
    ");
        else printf("%d
    ",ans );
    }
  • 相关阅读:
    VS2013 使用QCustomPlot等三方库如何配置
    error LNK1112:模块计算机类型"X64" 与目标计算机类型"X86" 冲突
    Qt 获取屏幕当前分辨率
    流程控制
    导航条和工作内容纪要
    js简介
    高度塌陷
    浮动
    文档流
    display和overflow
  • 原文地址:https://www.cnblogs.com/Absofuckinglutely/p/11432809.html
Copyright © 2011-2022 走看看