分层图91分求调
查看原帖
分层图91分求调
930686
Forge_Unique楼主2025/7/27 10:59
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 5e6 + 10;
int n,m,k,u,v,w;
int h[N],ver[N],e[N],ne[N],idx;
bool st[N];
long long d[N];
void add(int u,int v,int w){
	idx++,ver[idx] = v,e[idx] = w,ne[idx] = h[u],h[u] = idx;
}
void dij(){
    priority_queue <pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> heap;
    heap.push({0,1});
    memset(d,0x3f,sizeof(d));
    d[1] = 0;
    while(heap.size()){
        pair <int,int> T = heap.top();
        heap.pop();
        int x = T.second;
        if(st[x]){
            continue;
        }
        st[x] = true;
        for(int i = h[x];i;i = ne[i]){
            int j = ver[i];
            if(d[x] + e[i] < d[j]){
                d[j] = d[x] + e[i];
                heap.push({d[j],j});
            }
        }
    }
}
int main(){
	cin >> n >> m >> k;
	for(int j = 1;j <= m;j++){
		cin >> u >> v >> w;
		add(u,v,w),add(v,u,w);
		for(int i = 1;i <= k;i++){
			add(u + n * i,v + n * i,w);
			add(v + n * i,u + n * i,w);
			add(u + n * (i - 1),v + n * i,0);
			add(v + n * (i - 1),u + n * i,1);
		}
	}
	dij();
	long long ans = d[n];
	for(int i = 1;i <= k;i++){
	    ans = min(ans,d[n * (i + 1)]);
	}
	cout << ans;
	return 0;
}
2025/7/27 10:59
加载中...