Codeforces Round #636 (Div. 3) E—Weights Distributing
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #636 (Div. 3) E—Weights Distributing相关的知识,希望对你有一定的参考价值。
//无论a到b 和 b到c 有没有重合
//都可以写为
//a->x->b->x->c
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
int x=0,f=1;
char ch=getc();
while(ch<‘0‘||ch>‘9‘)
{
if(ch==‘-‘)f=-1;
ch=getc();
}
while(ch>=‘0‘&&ch<=‘9‘)
{
x=x*10+ch-‘0‘;
ch=getc();
}
return x*f;
}
const int N=4e5+7;
const ll mod=998244353;
ll pre[N];
int num[N];
int dis1[N],dis2[N],dis3[N];
int vis[N];
int e[N],ne[N],idx,h[N];
int T;
int n,m,a,b,c;
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void bfs(int x,int dis[])
{
for(int i=1; i<=n; i++)
vis[i]=0;
dis[x]=0;
vis[x]=1;
queue<int>q;
q.push(x);
while(q.size())
{
int now=q.front();
q.pop();
for(int j=h[now]; j!=-1; j=ne[j])
{
int i=e[j];
if(vis[i]==0)
{
vis[i]=1;
dis[i]=dis[now]+1;
q.push(i);
}
}
}
}
int main()
{
T=read();
while(T--)
{
idx=0;
n=read(),m=read(),a=read(),b=read(),c=read();
for(int i=0; i<=n; i++)
h[i]=-1;
for(int i=1; i<=m; i++)
num[i]=read();
for(int i=1; i<=m; i++)
{
int a=read(),b=read();
add(a,b);
add(b,a);
}
sort(num+1,num+1+m);
//边权的前缀和
for(int i=1; i<=m; i++)
pre[i]=pre[i-1]+num[i];
// cout<<endl;
//以a为起点,到各个点的距离,先默认边权为1
bfs(a,dis1);
bfs(b,dis2);
bfs(c,dis3);
ll ans=1e18;
for(int x=1; x<=n; x++)
{
if(dis1[x]+dis2[x]+dis3[x]>m)
continue;
ans=min(ans,pre[dis1[x]+dis2[x]+dis3[x]]+pre[dis2[x]]);
}
cout<<ans<<endl;
}
return 0;
}
以上是关于Codeforces Round #636 (Div. 3) E—Weights Distributing的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #636 (Div. 3)
Codeforces Round #636 (Div. 3)题解
codeforces Round #636 D. Constant Palindrome Sum
Codeforces Round #636 (Div. 3) E—Weights Distributing