WA+RE求调
查看原帖
WA+RE求调
728666
ZY_85楼主2024/10/4 16:21

照第一篇题解思路写的


#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e4+2,MAXM=5e4+2,MAXK=15;
int n,m,K,head[MAXN],val[MAXM<<3],to[MAXM<<3],nxt[MAXM<<3],indx=1,S,E,dis[MAXN],vis[MAXN];
void add(int a,int b,int v){
	to[indx]=b;
	val[indx]=v;
	nxt[indx]=head[a];
	head[a]=indx;
	indx++;
	return;
}
void init(){
	memset(dis,0x3f,sizeof(dis));
	cin>>n>>m>>K>>S>>E;
	S++;
	E++;
	int st,ed,v;
	for(int i=1;i<=m;i++){
		cin>>st>>ed>>v;
		add(st+1,ed+1,v);
		add(ed+1,st+1,v);
		for(int j=1;j<=K;j++){
			add(st+1,ed+j*n+1,0);
			add(ed+1,st+j*n+1,0);
			add(st+j*n+1,ed+j*n+1,v);
			add(ed+j*n+1,st+j*n+1,v);
		}
	}
	for(int i=1;i<=K;i++)add(n*(i-1)+E,n*i+E,0);
	return;
}
void solve(){
	int now;
	dis[S]=0;
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >pq;
	pq.push(make_pair(dis[S],S));
	while(!pq.empty()){
		now=pq.top().second;
		pq.pop();
		if(!vis[now]){
			vis[now]=true;
			for(int i=head[now];i;i=nxt[i]){
				if(dis[to[i]]>dis[now]+val[i]){
					dis[to[i]]=dis[now]+val[i];
					pq.push(make_pair(dis[to[i]],to[i]));
				}
			}
		}
	}
	return;
}
int main(){
	init();
	solve();
	cout<<dis[E+n*K];
	return 0;
}
2024/10/4 16:21
加载中...