65分 求助
查看原帖
65分 求助
173056
_Veritas楼主2020/11/28 10:14

P5340 分层图最短路 评测记录

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0;char c;
	c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
const int N=10004,M=100005,K=12;
int n,m,k,s,t;
bool a[N];//cola
inline int P(int i,int j){return i*n+j+k*n;}
const int MAXN=2*K*N+N,MAXM=4*K*N;
int head[MAXN],to[MAXM],nxt[MAXM],cnt;long long w[MAXM];
inline void add(int a,int b,int c){
	++cnt;
	to[cnt]=b;
	w[cnt]=c;
	nxt[cnt]=head[a];
	head[a]=cnt;
	return;
}
void init(){
	n=read();m=read();k=read();
	for(int i=1;i<=n;++i)
		a[i]=(read()==1);
	memset(head,0,sizeof(head));
	cnt=0;
	for(int i=1,u,v,w;i<=m;++i){
		u=read();v=read();w=read();
		if(a[v])
			for(int i=-k;i<k;++i)
				add(P(i,u),P(i+1,v),w);
		else
			for(int i=k;i>-k;--i)
				add(P(i,u),P(i-1,v),w); 
		if(a[u])
			for(int i=-k;i<k;++i)
				add(P(i,v),P(i+1,u),w);
		else
			for(int i=k;i>-k;--i)
				add(P(i,v),P(i-1,u),w);
	}
	s=read();t=read();
	return;
}
priority_queue<pair<long long,int> > q;
bool vis[MAXN];long long dis[MAXN];int now;
void dijkstra(){
	memset(vis,0,sizeof(vis));memset(dis,0x3f,sizeof(dis));
	q.push(make_pair(dis[(a[s]?P(1,s):P(-1,s))]=0,(a[s]?P(1,s):P(-1,s))));
	while(!q.empty()){
		now=q.top().second;
		q.pop();
		if(vis[now]) continue;
		vis[now]=true;
		for(int i=head[now];i;i=nxt[i])
			if(dis[to[i]] > dis[now]+w[i]){
				dis[to[i]]=dis[now]+w[i];
				q.push(make_pair(-dis[to[i]],to[i]));
			}
	}
	return;
}
int main(){
	int T=read();
	long long ans;
	while(T--){
		init();
		dijkstra();
		ans=dis[P(0,t)];
		for(int i=-k;i<=k;++i)
			ans=min(ans,dis[P(i,t)]);
		printf("%d\n",ans==4557430888798830399?-1:ans);
	}
	return 0;
}
2020/11/28 10:14
加载中...