题意是从1号点出发最短路遍历所有点求其中最长的边。
思路,很明显是最小生成树问题,用kruskal去做每次更新最大边即可。
附上代码。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e4+10;
const int maxa=2e3+10;
int par[maxa],rank1[maxa];//父亲,树的高度
int v,e;
struct edge{
int from,to, cost;
edge(int from=0,int to=0,int cost=0):from(from),to(to),cost(cost){};
bool operator <(const edge &b)const{
return cost<b.cost;
}
}es[maxn];
void init(int n){//初始化n个元素
for(int i=0;i<n;i++){
par[i]=i;
rank1[i]=0;
}
}
//查询树的根
int find(int x){
if(par[x]==x){
return x;
}else{
return par[x]=find(par[x]);//路径压缩
}
}
//合并x和y所属的集合
void unite(int x,int y){
x=find(x);
y=find(y);
if(x==y) return ;
if(rank1[x]<rank1[y]){
par[x]=y;
}else{
par[y]=x;
if(rank1[x]==rank1[y]) rank1[x]++;
}
}
bool same(int x,int y){
return find(x)==find(y);
}
int kruskal()
{
sort(es,es+e);
init(v);
int res=0;
for(int i=0;i<e;i++){
edge e=es[i];
if(!same(e.from,e.to)){
unite(e.from,e.to);
res=max(res,e.cost);
}
}
return res;
}
int main()
{
scanf("%d%d",&v,&e);
for(int i=0;i<e;i++){
scanf("%d%d%d",&es[i].from,&es[i].to,&es[i].cost);
es[i].from--;
es[i].to--;
}
int res=kruskal();
printf("%d\n",res);
}