求助分层图46pts/kk(以关注作回报)
查看原帖
求助分层图46pts/kk(以关注作回报)
508316
cyhyyds楼主2021/8/3 16:35

调傻了,和第一篇题解很像了

我寻思这dij和建边都没问题到底是哪出问题了。

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

using namespace std;

typedef pair<int, int> pii;

const int N = 2e6 + 7;
const int M = 155555; 

struct Edge {
	int to;
	int nxt;
	int w;
}e[N];

int head[M], edge_num = 0, n, m, k, s, t;

inline void add_edge (int x, int y, int z) {
	e[++edge_num] = (Edge) {y, head[x], z};
	head[x] = edge_num; 
}

int dis[M];

bool vis[M];

inline void Dij (int s) {
	memset (dis, 0x3f, sizeof (dis));
	
	dis[s] = 0;
	
	priority_queue<pii, vector<pii>, greater<pii> > q;
	
	q.push (make_pair (0, s));
	
	while (!q.empty()) {
		int u = q.top().second;
		
		q.pop();
		
		if (!vis[u]) {
			vis[u] = true;
			
			for (int i = head[u]; i; i = e[i].nxt) {
				int v = e[i].to;
				
				if (dis[v] > dis[u] + e[i].w) {
					dis[v] = dis[u] + e[i].w;
					
					q.push (make_pair(dis[v], v));
				}
			}
		}
	}
}

int main() {
	scanf ("%d%d%d%d%d", &n, &m, &k, &s, &t);
	
	for (int i = 1, u, v, w; i <= m; i ++) {
		scanf ("%d%d%d", &u, &v, &w);
		
		add_edge (u, u, w);
		add_edge (v, u, w);
		
		for (int j = 1; j <= k; j ++) {
			add_edge ((j - 1) * n + u, (j) * n + v, 0);
			add_edge ((j - 1) * n + v, (j) * n + u, 0);
			
			add_edge (j * n + u, j * n + v, w);
			add_edge (j * n + v, j * n + u, w);
		}
	}
	
	for (int i = 1; i <= k; i ++) {
		add_edge ((i - 1) * n + t, (i) * n + t, 0);
	}
	
	Dij (s);
	
	printf ("%d", dis[k * n + t]);
	
	return 0;
}
2021/8/3 16:35
加载中...