ROADS POJ - 1724(拆点)

Posted ssummerzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROADS POJ - 1724(拆点)相关的知识,希望对你有一定的参考价值。

ROADS 

思路:K = 10000,djkstra复杂度O(nlogn),如果我们把不同点的不同花费拆点,即d[花费][点] = 距离,则被拆为 N*K个点,则djkstra复杂度O(k*n*logn),复杂度可以接受。

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

#define ll long long
#define pb push_back
#define fi first
#define se second

const int N = 110;
const int INF = 1e9;
struct node{
    int v, w, c;
};
int n, k, m;
vector<node > E[N];
int d[10010][N];

void dijkstra(){
    for(int i = 0; i <= 10000; ++i){
        for(int j = 1; j <= 100; ++j){
            d[i][j] = INF;
        }
    }

    queue<pair<int ,int > > que;     
    d[0][1] = 0;
    que.push(make_pair(0, 1));
    while(!que.empty()){
        int c = que.front().fi;
        int u = que.front().se;
        que.pop();

        for(int i = 0; i < (int)E[u].size(); ++i){
            node e = E[u][i];
            if(c + e.c > k) continue;
            if(d[c + e.c][e.v] > d[c][u] + e.w){
                d[c + e.c][e.v] = d[c][u] + e.w;
                que.push(make_pair(c + e.c, e.v));
            }
        }
    }
}

void solve(){

    scanf("%d%d%d", &k, &n, &m);
    int u, v, w, c;
    for(int i = 0; i < m; ++i){
        scanf("%d%d%d%d", &u, &v, &w, &c);
        E[u].pb({v, w, c});
    }

    dijkstra();

    int ans = INF;
    for(int i = 0; i <= k; ++i){
        ans = min(ans, d[i][n]);
    }
    //printf("ans = ");
    printf("%d
", ans == INF ? -1 : ans);
}

int main(){
    
    solve();    
    //cout << "not error" << endl;
    return 0;
}

 

以上是关于ROADS POJ - 1724(拆点)的主要内容,如果未能解决你的问题,请参考以下文章

[poj1724]Roads

ROADS POJ - 1724(分层最短路)

ROADS POJ - 1724 约束最短路 暴搜 加剪枝

poj1724 ROADS

POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)

POJ2749 Building roads