题目
思路
这一题其实我觉得难的不是做题思路,而是读懂题目意思…题目楞是将求图的最小最长边繁化成了一堆公式,当你从那些公式里面读懂这个意思的时候其实就差不多做出来了。根据瓶颈生成树的性质,最小生成树一定是瓶颈生成树,因此最小生成树的最长边一定就是该树的最小最长边。所以只需套用Kruskal直接求最小生成树并输出最大边即可。
代码
#include <stdio.h>
#include <queue>
using namespace std;
struct edge
{
int dot1;
int dot2;
int weight;
bool operator <(const edge &e) const
{
return weight>e.weight;
}
};
struct set
{
int num;
int parent;
};
int count1[50010];
set s[50010];
int find(int n)
{
int p=n;
if(s[n].parent!=s[n].num)
{
while(s[p].parent!=s[p].num)
p=s[p].parent;
s[n].parent=p;
}
return p;
}
void unite(int m,int n)
{
int a=find(m);int b=find(n);
if(a==b)
return;
if(count1[a]<count1[b])
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
s[b].parent=a;
count1[a]=count1[a]+count1[b];
}
int main()
{
int n,m,root;
scanf("%d %d %d",&n,&m,&root);
for(int i=0;i<=n;i++)
{
s[i].num=i;s[i].parent=i;
}
priority_queue<edge> pile;
for(int i=0;i<m;i++)
{
int v,u,w;
scanf("%d %d %d",&v,&u,&w);
edge temp;
temp.dot1=v;temp.dot2=u;temp.weight=w;
pile.push(temp);
}
int count=0;
int max=0;
while(count<n-1&&!pile.empty())
{
edge tmp=pile.top();
pile.pop();
if(find(tmp.dot1)!=find(tmp.dot2))
{
unite(tmp.dot1,tmp.dot2);
if(tmp.weight>max)
max=tmp.weight;
count++;
}
}
printf("%d",max);
}