传送门
解析:
水题啊,带全并查集维护一下当前连通块内有没有两种点就行了。
然后Kruskal的思想,对边排序,倒序搞就行了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc get_char
#define pc putchar
#define cs const
namespace IO{
namespace IOONLY{
cs int Rlen=1<<18|1;
char buf[Rlen],*p1,*p2;
}
inline char get_char(){
using namespace IOONLY;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;
}
inline int getint(){
re int num;
re char c;
while(!isdigit(c=gc()));num=c^48;
while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);
return num;
}
}
using namespace IO;
cs int N=100005;
int n,m;
struct E{
int u,v,w;
friend bool operator<(cs E &a,cs E &b){
return a.w<b.w;
}
}edge[N];
#define rank Rank
int fa[N],rank[N];
inline int getfa(int x){
while(x^fa[x])x=fa[x]=fa[fa[x]];
return x;
}
bool haveA[N],haveB[N];
inline bool merge(int u,int v){
u=getfa(u),v=getfa(v);
if(u==v)return false;
if((haveA[u]||haveA[v])&&(haveB[u]||haveB[v]))return true;
if(rank[u]<rank[v])swap(u,v);
fa[v]=u;
haveA[u]|=haveA[v];
haveB[u]|=haveB[v];
if(rank[u]==rank[v])++rank[u];
return false;
}
#undef rank
signed main(){
n=getint();m=getint();
for(int re y=getint();y--;haveA[getint()]=true);
for(int re i=1;i<=m;++i)edge[i].u=getint(),edge[i].v=getint(),edge[i].w=getint();
for(int re P=getint();P--;){
int u=getint();
if(haveA[u])return puts("+00"),0;
haveB[u]=true;
}
for(int re i=1;i<=n;++i)fa[i]=i;
sort(edge+1,edge+m+1);
for(int re i=m;i;--i)if(merge(edge[i].u,edge[i].v))return cout<<edge[i].w,0;
return 0;
}