玄关求调,WA#3#4#8
查看原帖
玄关求调,WA#3#4#8
1011038
harenz楼主2024/10/9 13:32
#include <bits/stdc++.h>
#define ll long long
const int N=1e6+10;
using namespace std;
int k,n,m,x,y,s,e,w,d[N][5],vis[N][5],ans,sum;
struct ed{
	int v,w;
};
struct node{
	int v,w,cnt;
};
bool operator<(node x,node y){
	return x.w>y.w;
}
vector<ed> G[N];
void dks(int s){
	priority_queue<node> q;
	d[s][0]=0;
	node a={s,0,0};
	q.push(a);
	while(!q.empty()){
		auto t=q.top();
		q.pop();
		int u=t.v,ncnt=t.cnt;
		if(vis[u][ncnt])
			continue;
		vis[u][ncnt]=1;
		for(auto i:G[u]){
			int v=i.v,w=i.w;
			if(ncnt<k&&!vis[v][ncnt+1]&&d[v][ncnt+1]>d[u][ncnt]){
				d[v][ncnt+1]=d[u][ncnt];
				node a={v,d[v][ncnt+1],ncnt+1};
				q.push(a);
			}
			if(!vis[v][ncnt]&&d[v][ncnt]>d[u][ncnt]+w){
				d[v][ncnt]=d[u][ncnt]+w;
				node a={v,d[v][ncnt],ncnt};
				q.push(a);
			}
		}
	}
}
int main(){
//	freopen("data.in","r",stdin);
//	freopen("my.out","w",stdout);
	memset(d,0x3f,sizeof(d));
    scanf("%d%d%d",&n,&m,&k);
    scanf("%d%d",&s,&e);
    s++,e++;
    for(int i=1;i<=m;i++){
    	scanf("%d%d%d",&x,&y,&w);
    	x++,y++;
    	G[x].push_back({y,w});
    	G[y].push_back({x,w});
	}
	dks(s);
	ans=0x3f3f3f3f;
	for(int i=0;i<=k;i++)
		ans=min(ans,d[e][i]);
	printf("%d",ans);
    return 0;
} 
2024/10/9 13:32
加载中...