传送门
【题目分析】
emmm,一眼题我还能说啥?
直接做最大生成树,只要连接的两个联通块一个有电脑一个有服务器就直接返回边的值就行了。
数据出锅差评
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
const int MAXM=2e5+10;
int n,m,y,p,cnt;
int col[MAXN];
int fa[MAXN];
struct Edge{
int from,to;
int w;
friend inline bool operator<(const Edge &a,const Edge &b){
return a.w>b.w;
}
}edge[MAXM];
int Read(){
int i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-')
f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
void add(int x,int y,int z){
edge[cnt].from=x;
edge[cnt].to=y;
edge[cnt].w=z;
cnt++;
}
int find(int x){
if(x==fa[x])
return x;
return fa[x]=find(fa[x]);
}
int kruskal(){
for(int i=1;i<=n;++i)
fa[i]=i;
sort(edge,edge+cnt);
for(int i=0;i<cnt;++i){
int u=edge[i].from,v=edge[i].to;
int fu=find(u),fv=find(v);
if(fu!=fv){
if((col[fu]^col[fv])==1){
return edge[i].w;
}
else{
if(col[fu]!=col[fv]&&col[fv]==-1)
col[fv]=col[fu];
}
fa[fu]=fv;
}
}
}
int main(){
n=Read(),m=Read();
memset(col,-1,sizeof(col));
y=Read();
for(int i=1;i<=y;++i){
int a=Read();
col[a]=0;
}
for(int i=1;i<=m;++i){
int a=Read(),b=Read(),c=Read();
add(a,b,c);
}
p=Read();
for(int i=1;i<=p;++i){
int a=Read();
if(col[a]==0){
puts("+00");
return 0;
}
col[a]=1;
}
cout<<kruskal();
return 0;
}