D - 数据中心
题目描述
Example
Input
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
Output
4
题目思路
根据题意可知,这也是一个最小生成树的问题,我们需要求的是一个有权无向图的最小生成树。但是这里需要注意这里求的是生成树中最大边权最小的问题。所以我们只需在Kruskal算法略加修改就可以了。
代码实现
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#define _for(i,a,b) for(int i = (a); i < (b); i++)
#define _rep(i,a,b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 5e4 + 10;
const int MAXM = 1e5 + 10;
int n,m,root,ans,cnt,tot;
struct Edge{
int u,v,w;
bool operator < (const Edge& e)const{
return w < e.w;
}
}Edges[MAXM];
void addEdge(int u,int v,int w)
{
Edges[tot].u = u;
Edges[tot].v = v;
Edges[tot].w = w;
tot++;
}
int par[MAXN],rnk[MAXN];
int find(int x)
{
return par[x] == x ? x : par[x] = find(par[x]);
}
bool unite(int x,int y)
{
x = find(x), y = find(y);
if(x == y) return false;
if(rnk[x] > rnk[y]) swap(x,y);
par[x] = y, rnk[y] = (rnk[x] += rnk[y]);
return true;
}
void init()
{
tot = 1;
cin >> n >> m >> root;
_rep(i,1,n)
{
par[i] = i;
rnk[i] = 1;
}
int a,b,weight;
_for(i,0,m)
{
cin >> a >> b >> weight;
addEdge(a,b,weight);
}
}
void Kruskal()
{
sort(Edges+1,Edges+m+1);
_rep(i,1,m)
{
if(find(Edges[i].u) != find(Edges[i].v))
{
unite(Edges[i].u,Edges[i].v);
ans = max(ans,Edges[i].w);
cnt++;
}
if(cnt == n)break;
}
}
int main()
{
ios::sync_with_stdio(false);
init();
Kruskal();
cout << ans ;
}