点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
你只要能看明白是最小生成树,那么就很简单了,注意剪枝。
#include<iostream>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
typedef pair<int,int> P;
int main(){
vector<P> G[50001];
int n,m,r,ans=0,f,S[50001];
std::ios_base::sync_with_stdio(false),cin.tie(NULL);
cin>>n>>m>>r,memset(S,0,sizeof(S));
for(int i=0,u,v,t;i<m;++i) cin>>u>>v>>t,G[u].emplace_back(P(v,t)),G[v].emplace_back(P(u,t));
S[r]=1,--n;
map<int,vector<int> > M;
for(int i=0,ni=G[r].size();i<ni;++i) M[G[r][i].second].emplace_back(G[r][i].first);
while(n>0){
f=0;
for(map<int,vector<int> >::iterator it=M.begin();it!=M.end()&&f==0;){
vector<int>&v=it->second;
for(int i=v.size()-1;i>-1&&f==0;--i){
if(S[v[i]]==0){
S[v[i]]=1,f=1,--n,ans=max(ans,it->first);
for(int j=0,nj=G[v[i]].size();j<nj;++j){
if(S[G[v[i]][j].first]==0) M[G[v[i]][j].second].emplace_back(G[v[i]][j].first);
}
}
v.erase(v.begin()+i);
}
if(v.size()==0) M.erase(it++);else ++it;
}
}
cout<<ans<<endl;
return 0;
}