一直过不了点9,求看
查看原帖
一直过不了点9,求看
40318
Acfboy楼主2020/7/26 19:06
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
using namespace std;
int vet[400005], lon[400005], head[100005], nxt[400005], num, n, m, s, x, y, z,
    dis[100005], f[10005][15], e, k;
struct node{
    int dis, u;
    bool operator < (node x) const{
        return dis > x.dis;
    }
};
priority_queue <node> heap;
void add(int u, int v, int c){
    num ++;
    vet[num] = v; lon[num] = c;
    nxt[num] = head[u];
    head[u] = num;
}
void Dijkstra(int s){
    memset(dis, 127, sizeof(dis));
    dis[s] = 0;
    f[s][0] = 0;
    node now; 
    now.u = s; now.dis = 0;
    heap.push(now);
    while(!heap.empty()){
        now = heap.top();
        heap.pop();
        int u = now.u, d = now.dis;
        if(d != dis[u]) continue;
        for(int i = head[u]; i; i = nxt[i]){
            int v = vet[i];
            if(dis[u] + lon[i] < dis[v]){
                dis[v] = dis[u] + lon[i];
                now.u = v; now.dis = dis[v];
                heap.push(now);
                f[v][0] = dis[v];
                for(int j = 1; j <= k; j++)
                    f[v][j] = min(f[v][j], min(f[u][j] + lon[i], f[u][j-1]));
            }
        }
    }
}
int main(){
    scanf("%d%d%d", &n, &m, &k);
    scanf("%d%d", &s, &e);  
    for(int i = 1; i <= m; i++){
        scanf("%d%d%d", &x, &y, &z);
        add(x, y, z);
        add(y, x, z);
    }
    memset(f, 127, sizeof(f));
    int ans = f[1][1];
    Dijkstra(s);
    for(int i = 0; i <= k; i++) 
        ans = min(ans, f[e][i]);
    printf("%d", ans);
    return 0;
}
2020/7/26 19:06
加载中...