题意有些晦涩难懂。。。
(1)给出一张图,存在自环和重边,但是最终有贡献的边是两点之间的最短路(就是一张图的最小生成树)
(2)对于每个特殊点,求他到其他特殊点的路径上最长的一条边
对答案可能有贡献的边一定两边都有特殊点(从树上来看),这样我们找到所有这样的边,然后找到其中最大的就是答案,因为对于每个特殊点,我们总是可以取到改边另一侧的特殊点从而达到这个答案
(3)考虑做最小生成树的时候怎么判断该边是否符合要求。回忆做Kru的过程,把所有边排序,每次加边时连通两个连通块,直到只剩下一个连通块为止。假设我们最终要求的答案边为a,那么做最小生成树轮到a边的时候,必定能将所有特殊点连接起来(因为a是任意两个特殊点之间路径的最长边),保证不会出现失配情况。
int f[MX];
int tag[MX];//记录某连通块是否存在关键点
int find(int x)
{
return x==f[x]?x:f[x]=find(f[x]);
}
vector<pair<int,pii> >edges;
signed main()
{
int n,m,k;cin>>n>>m>>k;
rpp(i,n) f[i]=i;
rpp(i,k)
{
int x;cin>>x;
tag[x]=1;
}
rpp(i,m)
{
int u,v,w;cin>>u>>v>>w;
edges.push_back(make_pair(w,make_pair(u,v)));
}
sort(all(edges));
int ans=0;
for(auto i:edges)
{
int fx=find(i.second.first),fy=find(i.second.second),w=i.first;
if(fx!=fy)
{
if(tag[fx]&&tag[fy]) ans=max(ans,w);
tag[fx]|=tag[fy];
f[fy]=fx;
}
}
rpp(i,k) cout<<ans<<" ";
cout<<endl;
stop;
return 0;
}