Advertisement
3600. Maximize Spanning Tree Stability with Upgrades
UnknownView on LeetCode
3600.cs
C#
public class Solution
{
int n;
int[][] edges;
int k;
private bool Check(int lim)
{
UnionFind uf = new UnionFind(n);
foreach (var e in edges)
{
int u = e[0], v = e[1], s = e[2];
if (s >= lim)
uf.Union(u, v);
}
int rem = k;
foreach (var e in edges)
{
int u = e[0], v = e[1], s = e[2];
if (s * 2 >= lim && rem > 0)
{
if (uf.Union(u, v))
rem--;
}
}
return uf.cnt == 1;
}
public int MaxStability(int n, int[][] edges, int k)
{
this.n = n;
this.edges = edges;
this.k = k;
UnionFind uf = new UnionFind(n);
int mn = (int)1e6;
foreach (var e in edges)
{
int u = e[0], v = e[1], s = e[2], must = e[3];
if (must == 1)
{
mn = Math.Min(mn, s);
if (!uf.Union(u, v))
return -1;
}
}
foreach (var e in edges)
uf.Union(e[0], e[1]);
if (uf.cnt > 1)
return -1;
int l = 1, r = mn;
while (l < r)
{
int mid = (l + r + 1) >> 1;
if (Check(mid))
l = mid;
else
r = mid - 1;
}
return l;
}
}
class UnionFind
{
int[] p, size;
public int cnt;
public UnionFind(int n)
{
p = new int[n];
size = new int[n];
cnt = n;
for (int i = 0; i < n; i++)
{
p[i] = i;
size[i] = 1;
}
}
public int Find(int x)
{
if (p[x] != x)
p[x] = Find(p[x]);
return p[x];
}
public bool Union(int a, int b)
{
int pa = Find(a), pb = Find(b);
if (pa == pb) return false;
if (size[pa] > size[pb])
{
p[pb] = pa;
size[pa] += size[pb];
}
else
{
p[pa] = pb;
size[pb] += size[pa];
}
cnt--;
return true;
}
}Advertisement
Was this solution helpful?