CodeForces - 1468J - Road Reform (最小生成树)

简介: 笔记

Road Reform


题意

给你一个 n个顶点 m条边的无向图 (没有重边) 要求删掉 m − ( n − 1 ) 条边使得图仍联通 并且权值最大的边与 k 的差值最小


思路

先把所有小于等于k 的边加入新图 然后判断是否连通


如果已经联通 那么有两种选择


1.将已经加入的最大边权增大到 k


2.将大于 k的第一条边加入 并且减少到k


如果没有联通 那么按照边权递增的顺序加入边 直到联通为止


代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define endl '\n'
using namespace std;
typedef  long long LL;
typedef pair<int, int>PII;
inline LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; }
const int N = 200010;
int n, m, k;
int f[N];
struct Node {
  int u, v, w;
}node[N];
void init() {
  for (int i = 0; i < N; ++i)f[i] = i;
}
int Find(int x) {
  return x == f[x] ? x : f[x] = Find(f[x]);
}
void merge(int a, int b) {
  f[Find(a)] = Find(b);
}
bool cmp(Node a, Node b) {
  return a.w < b.w;
}
void solve() {
  cin >> n >> m >> k;
  init();
  for (int i = 1; i <= m; ++i) {
    int a, b, c; scanf("%d%d%d", &node[i].u, &node[i].v, &node[i].w);
  }
  sort(node + 1, node + m + 1, cmp);
  int cnt = 0;
  int i;
  for (i = 1; i <= m; ++i) {
    if (node[i].w > k)break;
    int fa = Find(node[i].u);
    int fb = Find(node[i].v);
    if (fa != fb) {
      merge(fa, fb);
      cnt++;
    }
  }
  //cout << node[i - 1].w << " " << node[i].w << endl;
  if (cnt == n - 1) {
    int res = k - node[i - 1].w;
    if (i <= m)res = min(res, node[i].w - k);
    printf("%d\n", res);
  }
  else {
    LL res = 0;
    for (int j = i; j <= m; ++j) {
      int fa = Find(node[j].u);
      int fb = Find(node[j].v);
      if (fa != fb) {
        cnt++;
        merge(fa, fb);
        res += node[j].w - k;
      }
      if (cnt == n - 1)break;
    }
    cout << res << endl;
  }
}
int main() {
  int t; cin >> t;
  while(t--)
    solve();
  return 0;
}


目录
相关文章
UVa11420 - Chest of Drawers(动态规划)
UVa11420 - Chest of Drawers(动态规划)
50 0
UVa11710 - Expensive subway(最小生成树)
UVa11710 - Expensive subway(最小生成树)
52 0
|
机器学习/深度学习 C++
【PAT甲级 - C++题解】1105 Spiral Matrix
【PAT甲级 - C++题解】1105 Spiral Matrix
72 0
|
机器学习/深度学习 C++
【PAT甲级 - C++题解】1059 Prime Factors
【PAT甲级 - C++题解】1059 Prime Factors
86 0
2019CCPC秦皇岛HDU - 6736 F - Forest Program(dfs找环 组合数学)
2019CCPC秦皇岛HDU - 6736 F - Forest Program(dfs找环 组合数学)
103 0
codeforces1253——D. Harmonious Graph(并查集)
codeforces1253——D. Harmonious Graph(并查集)
99 0
2021杭电多校第三场-Road Discount-wqs二分+最小生成树
get函数是求出将黑色的边权加上一个值x之后的一个花费,我们会这个函数处理出x=-1000->1000的所有情况,然后将信息储存在save中,然后在询问的时候,直接遍历save集合,遇见满足情况的便直接输出,否则输出-1,虽然没有-1的情况/doge
143 0
2021杭电多校第三场-Road Discount-wqs二分+最小生成树
|
机器学习/深度学习
[Nowcoder | UPC] 2021年度训练联盟热身训练赛第六场 Hopscotch | 最短路 bfs
题目描述 There’s a new art installation in town, and it inspires you… to play a childish game. The art installation consists of a floor with an n×n matrix of square tiles. Each tile holds a single number from 1 to k. You want to play hopscotch on it.
127 0
|
C语言
HDOJ/HDU Tempter of the Bone(深搜+奇偶性剪枝)
HDOJ/HDU Tempter of the Bone(深搜+奇偶性剪枝)
104 0