社区讨论

来自旅行者的求助,最短路64pts求调qwq

P5304[GXOI/GZOI2019] 旅行者参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo1j5a8k
此快照首次捕获于
2023/10/22 21:54
2 年前
此快照最后确认于
2023/11/02 22:47
2 年前
查看原帖
CPP
// Problem: P5304 [GXOI/GZOI2019] 旅行者
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5304
// Memory Limit: 500 MB
// Time Limit: 5000 ms
// Author: fzy
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
// #pragma GCC optimize(2)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define int ll

const int maxn=5e5+10;
const int inf=1e16;
int n,m,t,k,ans=inf,a[maxn];
struct node{
	int v,w;
};
vector<node> g[maxn];

inline int read() {
    int s=0,w=1;
    char ch=getchar();
    while(!isdigit(ch)) {
        if(ch=='-')w=-1;
        ch=getchar();
    }
    while(isdigit(ch)) s=s*10+ch-'0',ch=getchar();
    return s*w;
}

inline void write(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

int dis[maxn],vis[maxn];

priority_queue<pii,vector<pii>,greater<pii> > pq;
inline void dijkstra(int x) {
	memset(dis,127,sizeof dis);
	memset(vis,0,sizeof vis);
	dis[x]=0;
	pq.push(make_pair(dis[x],x));
	while(!pq.empty()) {
		int u=pq.top().second,d=pq.top().first;
		pq.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=0;i<(int)g[u].size();++i) {
			int v=g[u][i].v,w=g[u][i].w;
			if(dis[v]>w+d) {
				dis[v]=w+d;
				pq.push(make_pair(dis[v],v));
			}
		}
	}
}

int u[maxn],v[maxn],w[maxn];

inline void init() {
	ans=inf;
	memset(a,0,sizeof a);
	memset(u,0,sizeof u);
	memset(v,0,sizeof v);
	memset(w,0,sizeof w);
	for(int i=1;i<=n+2;++i)
		g[i].clear();
}

signed main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
    t=read();
    while(t--) {
    	n=read(),m=read(),k=read();
    	for(int i=1;i<=m;++i) {
    		u[i]=read(),v[i]=read(),w[i]=read();
    		g[u[i]].push_back(node{v[i],w[i]});
    	}
    	for(int i=1;i<=k;++i) {
    		a[i]=read();
    	}
    	for(int i=0;i<=20;++i) {
    		int cnt=0;
    		for(int d=1;d<=k;++d) {
    			int j=a[d];
    			if((j&(1<<i))) {
    				cnt++;
    				g[n+1].push_back(node{j,0});
    			}
    			else g[j].push_back(node{n+2,0});
    		}
    		if(cnt==0||cnt==n) continue;
    		dijkstra(n+1);
    		ans=min(ans,dis[n+2]);
    		
    		for(int i=1;i<=n+2;i++) g[i].clear();
    		for(int i=1;i<=m;++i)
    			g[u[i]].push_back(node{v[i],w[i]});
    		
    		cnt=0;
    		for(int d=1;d<=k;++d) {
    			int j=a[d];
    			if(!(j&(1<<i))) {
    				cnt++;
    				g[n+1].push_back(node{j,0});
    			}
    			else g[j].push_back(node{n+2,0});
    		}
    		if(cnt==0||cnt==n) continue;
    		dijkstra(n+1);
    		ans=min(ans,dis[n+2]);
    		
    		for(int i=1;i<=n+2;i++) g[i].clear();
    		for(int i=1;i<=m;++i)
    			g[u[i]].push_back(node{v[i],w[i]});
    	}
    	write(ans),puts("");
    	init();
    }
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...