题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1486
这题在比赛时卡了我许久,看了许久用最短路改变一下条件写了一个,TLE了,然后就没办法了,后来看了题解,这么简单的题竟然除了我还有人没做出来
我来实验室的时候最小生成树的学习已经跳过了,然后这类题后来也没接触过,还是学的不够啊
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <stack>
#include <queue>
#include <sstream>
#include <vector>
#include <set>
using namespace std;
const int maxn=100005;
struct node
{
int u,v,w;
}a[maxn];
int n,m,ans,num;
int pre[10005];
int cmp(struct node a,struct node b)
{
return a.w<b.w;
}
int find(int x)
{
if(x!=pre[x])
pre[x]=find(pre[x]);
return pre[x];
}
void kruskal()
{
for(int i=0;i<m;i++)
{
int fx=find(a[i].u);
int fy=find(a[i].v);
if(fx!=fy)
{
pre[fx]=fy;
num++;
ans=max(ans,a[i].w+n-num);//关键部分,我来说下,这是每一条路的要花费的魔法值,因为每建一条路就要减一费,而且建成后绝对是一个树,所以n-num是预计他还要花掉多少费
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
}
sort(a,a+m,cmp);
ans=0;
num=1;
kruskal();
printf("%d\n",ans);
}
return 0;
}