Description
Alice 和 Bob 共有一个无向图,其中包含 n 个节点和 3 种类型的边:
类型 1:只能由 Alice 遍历。
类型 2:只能由 Bob 遍历。
类型 3:Alice 和 Bob 都可以遍历。
给你一个数组 edges ,其中 edges[i] = [typei, ui, vi] 表示节点 ui 和 vi 之间存在类型为 typei 的双向边。请你在保证图仍能够被 Alice和 Bob 完全遍历的前提下,找出可以删除的最大边数。如果从任何节点开始,Alice 和 Bob 都可以到达所有其他节点,则认为图是可以完全遍历的。
返回可以删除的最大边数,如果 Alice 和 Bob 无法完全遍历图,则返回 -1 。
Solution
贪心:公共边优先级比其他的高,首先考虑。
并查集需要路径压缩,不然会TLE。
AC Code
class bcj{
public:
int num = 0;
int f[100010];
int size[100010];//深度
bcj(int n){
num = n;
for(int i=0;i<100010;i++) {
f[i]=i;
size[i]=1;
}
}
int find(int x){
return f[x]==x?x:find(f[x]);
}
bool meger(int x,int y){
x = find(x);
y = find(y);
if(x==y) return 0;
if(size[x]>size[y]) swap(x,y);
f[x]=y;
size[y]+=size[x];
num--;
return 1;
}
};
class Solution {
public:
int maxNumEdgesToRemove(int n, vector<vector<int>>& edges) {
bcj a(n),b(n);
int ans = 0;
for(vector<int> v : edges){
if(v[0]==3){
if(a.meger(v[1],v[2])==0) ans++;
else b.meger(v[1],v[2]);
}
}
for(vector<int> v : edges){
if(v[0]==1){
if(a.meger(v[1],v[2])==0) ans++;
}
else if(v[0]==2){
if(b.meger(v[1],v[2])==0) ans++;
}
}
if(a.num != 1 || b.num!=1) return -1;//不连通
else return ans;
}
};