初学分层图2.5ms 求助!样例输出18(但是 36pts)
查看原帖
初学分层图2.5ms 求助!样例输出18(但是 36pts)
804607
rainygame楼主2023/5/1 11:34
#include <bits/stdc++.h>
using namespace std;
#define MAXN 110001
#define MAXM 1050001
using Pair = pair<int, int>;

int n, m, k, s, t, u, v, w;
int dis[MAXN];
bitset<MAXN> vis;
priority_queue<Pair, vector<Pair>, greater<Pair>> pq;

struct Edge{
	int v, w;
};
vector<Edge> e[MAXN];

void dijkstra(){
	memset(dis, 0x3f, sizeof(dis));
	dis[s] = 0;
	while (!pq.empty()) pq.pop();
	
	pq.push(make_pair(0, s));
	while (!pq.empty()){
		u = pq.top().second;
		pq.pop();
		
		if (vis[u]) continue;
		vis[u] = true;
		
		for (auto i: e[u]){
			v = i.v;
			if (dis[v] > dis[u] + i.w){
				dis[v] = dis[u] + i.w;
				pq.push(make_pair(dis[v], v));
			}
		}
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n >> m >> k >> s >> t;
	
	while (m--){
		cin >> u >> v >> w;
		e[u].push_back({v, w});
		e[v].push_back({u, w});
		for (int i(1); i<=k; ++i){
			e[i*n+u].push_back({i*n+v, w});
			e[i*n+v].push_back({i*n+u, w});		
		}
		for (int i(0); i<k; ++i){
			e[i*n+v].push_back({(i+1)*n+v, 0});
			e[i*n+u].push_back({(i+1)*n+u, 0});
		}
	}
	
	for (int i=1; i<=k; ++i) e[t+(i-1)*n].push_back({t+i*n, 0});
	
	dijkstra();
	cout << dis[t+k*n];
	
	return 0;
}

2023/5/1 11:34
加载中...