[ABC352E]题解
思路
这里提供一种暴力做法。方法就是当边数到达一个值过后就不加边了。我取的值是 ,实际上可以开大一些,只要 不超时就行了。
代码
#include <bits/stdc++.h> using namespace std; #define int long long int a[200020]; int cnt; struct rec { int x, y, z; } edge[5000010]; int fa[500010]; bool operator<(rec a, rec b) { return a.z < b.z; } int get(int x) { return fa[x] == x ? x : fa[x] = get(fa[x]); } signed main() { cin.tie(0), cout.tie(0); ios::sync_with_stdio(0); int n, m; cin >> n >> m; for (int i = 1; i <= m; i++) { int k, c; cin >> k >> c; for (int i = 1; i <= k; i++) { cin >> a[i]; } if(cnt>5000000) continue; for (int i = 1; i < k; i++) { for (int j = i + 1; j <= k; j++) { int u = a[i], v = a[j]; if(cnt>5000000) break; edge[++cnt] = {u, v, c}; } if(cnt>5000000) break; } } sort(edge + 1, edge + cnt + 1); for(int i=1;i<=n;i++) fa[i]=i; int ans = 0; for (int i = 1; i <= cnt; i++) { int x = get(edge[i].x), y = get(edge[i].y); if (x == y) continue; fa[x] = y; ans += edge[i].z; } int flag = 0; for (int i = 1; i <= n; i++) if (fa[i] == i) flag++; if (flag > 1) cout << "-1"; else cout << ans; return 0; }
本文作者:merlinkkk
本文链接:https://www.cnblogs.com/merlinkkk/p/18306119
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步