有个疑问
查看原帖
有个疑问
1165228
o_CIHL楼主2024/10/19 23:45

这题我用没关流的cin读边和scanf时间居然差不多!?(都能ac) 是数据太水了吗?……

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+11, M = 1e5+11;

int n, m, k, v[N][11], d[N][11], s, t;
int head[N], ver[M], nex[M], edge[M], tot;

void add(int x, int y, int z){
	nex[++tot] = head[x];
	head[x] = tot;
	edge[tot] = z;
	ver[tot] = y;
}

void dija(){ // 花费,点编号,使用的免费次数 
	priority_queue<pair<int, pair<int, int>>> q;
	q.push(make_pair(0, make_pair(s, 0)));
	d[s][0] = 0;
	
	while(q.size()){
		int w = -q.top().first;
		int x = q.top().second.first;
		int kt = q.top().second.second;
		q.pop(); if(v[x][kt]) continue; v[x][kt] = 1;
		
		for(int i=head[x]; i; i=nex[i]){
			int y = ver[i], e = edge[i];
			if(d[y][kt] > w + e){
				d[y][kt] = w + e;
				q.push(make_pair(-d[y][kt], make_pair(y, kt)));
			} if(kt == k) continue;
			if(d[y][kt+1] > w){
				d[y][kt+1] = w;
				q.push(make_pair(-d[y][kt+1], make_pair(y, kt + 1)));
			}
		}
	}
}

int main(){
	cin>>n>>m>>k>>s>>t;
	for(int i=0;i<=n;i++)
	for(int j=0;j<=k;j++)
	d[i][j] = 0x3f3f3f3f;
	
	int x, y, z;	
	for(int i=0;i<m;i++){
		cin>>x>>y>>z;
		add(x, y, z); add(y, x, z); 
	}
	dija();
	int ans = 0x3f3f3f3f;
	for(int i=0;i<=k;i++) ans = min(ans, d[t][i]);
	cout<<ans<<endl;
	return 0;
}
2024/10/19 23:45
加载中...