我用的是并查集,用并查集的话这道题很容易理解。首先就是创建一个结构体,其次就是并查集模板和sort,这些都没什么好说的。接下来就是存数据,然后我的做法是一边将两个村庄合并,一边算是否将这N个村庄合并到一块,flag2的意思是这n个村庄是否合并到一块,flag1是标记最短的时间。
最后就是代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
const int maxn= 1010;
struct node{
int fx;
int sx;
int t;
};
int pa[maxn],n,m;
int find(int x){return pa[x]!=x?pa[x]=find(pa[x]):x;}
void Union(int x,int y){
int px=find(x);
int py=find(y);
if(px!=py)
pa[px]=py;
}
bool cmp(node a,node b){
return a.t<b.t;
}
int main(){
scanf("%d%d",&n,&m);
vector<node> v(m+1);
for(int i=1;i<=n;i++) pa[i]=i;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&v[i].fx,&v[i].sx,&v[i].t);
sort(v.begin()+1,v.end(),cmp);
int flag1=0,flag2=-1;
for(int i=1;i<=m;i++){
int cnt=0;
Union(v[i].fx,v[i].sx);
for(int j=1;j<=n;j++){
if(pa[j]==j) cnt++;
}
if(cnt==1){
if(flag1==0) flag1=i;
flag2=1;
}
}
if(flag2==-1) printf("%d\n",flag2);
else printf("%d",v[flag1].t);
return 0;
}