这道题用的是并查集,刚刚看到这道题的时候想起来自己OJ的一道有点相似的题,说是每条边有一个等级,两个点之间的连接等级为路径上所有边的最高等级,很像,但是因为这道题的边有权值而且还要算最大值,结果自己这个想法就只是想了想,然后看了别人的解题报告,还真是并查集,看来自己的第一反应还挺重要的,把边降序排序,这样保证新加的一条边肯定是最短的,分别对这条边连接的两个点作为这一部分中选中的点找最优值,直到把所有的边加完
View Code
1 #include2 #include 3 #include 4 #include 5 #define N 200005 6 #define max(a,b) ((a)>(b)?(a):(b)) 7 using namespace std; 8 struct node 9 {10 long long u,v;11 long long w;12 };13 node e[N];14 int cmp(const void *a,const void *b)15 {16 node *c=(node *)a;17 node *d=(node *)b;18 if(d->w>c->w)19 return 1;20 else21 return -1;22 }23 long long f[N],num[N];24 long long sum[N];25 void init()26 {27 int i;28 for(i=1;i btoa)72 {73 f[fa]=fb;74 sum[fb]=atob;75 num[fb]+=num[fa];76 }77 else78 {79 f[fb]=fa;80 sum[fa]=btoa;81 num[fa]+=num[fb];82 }83 ans=max(ans,max(atob,btoa));84 }85 printf("%lld\n",ans);86 }87 return 0;88 }