社区讨论
来自旅行者的求助,最短路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 条回复,欢迎继续交流。
正在加载回复...