#include <vector>
using namespace std;
class Solution {
public:
class DSU {
public:
vector<int> parent, rank;
int components;
DSU(int n) : parent(n + 1), rank(n + 1, 1), components(n) {
for (int i = 1; i <= n; ++i)
parent[i] = i;
}
DSU(const DSU& other) : parent(other.parent), rank(other.rank),
components(other.components) {}
int find(int x) {
return parent[x] == x ? x : (parent[x] = find(parent[x]));
}
bool unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y)
return false;
if (rank[x] < rank[y])
swap(x, y);
parent[y] = x;
if (rank[x] == rank[y])
rank[x]++;
components--;
return true;
}
};
int maxRemovableEdges(int n, vector<vector<int>>& edges) {
if (n == 1)
return edges.size();
DSU type3_dsu(n);
for (const auto& e : edges) {
int type = e[0], u = e[1], v = e[2];
if (type == 3)
type3_dsu.unite(u, v);
}
int c3_components = type3_dsu.components;
DSU alice = type3_dsu;
for (const auto& e : edges) {
int type = e[0], u = e[1], v = e[2];
if (type == 1)
alice.unite(u, v);
}
if (alice.components != 1)
return -1;
DSU bob = type3_dsu;
for (const auto& e : edges) {
int type = e[0], u = e[1], v = e[2];
if (type == 2)
bob.unite(u, v);
}
if (bob.components != 1)
return -1;
int min_edges = (n - 1) + (c3_components - 1);
return edges.size() - min_edges;
}
};
采用QwQ-32B Q6_K(20250312版本)通过llama.cpp AI生成,参数根据readme和论文建议进行设置。
prompt:以下是一道算法题,请你用尽可能低的时间和空间复杂度,尽可能短的代码,在符合题目要求的情况下用C++20完成这道题,并给出解题思路,\n代表换行:“描述\n在一个神奇的动物牛国度中,生活着许多有趣的动物。Alice 和 Bob 是这个国度中的两位勇士,他们决定一起展开一次探险之旅。他们面前是一个神秘的无向图,图中有 n 个节点和 3 种类型的边:\n类型 1:只有 Alice 可以经过的边。\n类型 2:只有 Bob 可以经过的边。\n类型 3:Alice 和 Bob 都可以经过的边。\n他们想要确保无论从哪个节点出发,Alice 和 Bob 都能够遍历到所有其他节点。为了达到这个目标,他们可以删除一些边。删除边后,他们希望仍然能够完成完全的探险之旅。\n请你编写一个函数 int maxRemovableEdges(int n, vector<vector<int>>& edges),来帮助 Alice 和 Bob 计算可以删除的最大边数。如果无论如何删除边,Alice 和 Bob 仍然无法完全遍历图,则返回 -1。\n函数输入参数:\nn:一个整数,表示节点的个数。\nedges:一个二维整数数组,表示边的信息。每个元素 edges[i] = [typei, ui, vi] 表示节点 ui 和 vi 之间存在类型为 typei 的双向边。边的类型 typei 可以是 1、2 或 3,正好对应上述三种情况。\n函数输出:\n返回一个整数,表示可以删除的最大边数。如果无论如何删除边,Alice 和 Bob 仍然无法完全遍历图,则返回 -1。\n备注\n1 <= n <= 10^5\n1 <= edges.length <= min(10^5, 3 * n * (n-1) / 2)\nedges[i].length == 3\n1 <= edges[i][0] <= 3\n1 <= edges[i][1] < edges[i][2] <= n\n所有元组 (typei, ui, vi) 互不相同\n示例\n输入:3,[[1, 1, 2],[2, 2, 3],[3, 1, 3],[1, 1, 3]],输出:1\n输入:4,[[3, 1, 2],[3, 2, 3],[1, 1, 3],[1, 2, 4],[1, 1, 2],[2, 3, 4]],输出:2\n输入:5,[[3, 1, 2],[3, 2, 3],[3, 3, 4],[3, 4, 5],[1, 1, 3],[1, 2, 4],[1, 3, 5]],输出:3”

京公网安备 11010502036488号