题解 | #动物牛的探险之旅#
动物牛的探险之旅
https://www.nowcoder.com/practice/14553bb44c854257ac3a86da2b35dfdd
核心思想就是:三类边一定比一类和二类更好。此外,如果有三类边形成的环,则打破这个环。
#include <queue>
#include <unordered_map>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @param edges int整型vector<vector<>>
* @return int整型
*/
int ret = 0;
void dfs(vector<vector<bool>>& A, vector<vector<bool>>& A_both, unordered_set<int> &vis, int cur, int last){
if(vis.count(cur)) return;
vis.insert(cur);
if(last!=-1){
for(auto u: vis){
if(u==last) continue;
if(A[u][cur]){
ret++;
A[u][cur] = false;
A[cur][u] = false;
}
}
}
for(int i=0;i<A.size();i++){
if(A_both[cur][i]) dfs(A, A_both, vis, i, cur);
}
for(int i=0;i<A.size();i++){
if(A[cur][i]) dfs(A, A_both, vis, i, cur);
}
}
void dfs_both(vector<vector<bool>>& A, unordered_set<int> &vis, int cur, int last){
if(vis.count(cur)) return;
vis.insert(cur);
if(last!=-1){
for(auto u: vis){
if(u==last) continue;
if(A[u][cur]){
ret++;
A[u][cur] = false;
A[cur][u] = false;
}
}
}
for(int i=0;i<A.size();i++){
if(A[cur][i]) dfs(A, A, vis, i, cur);
}
}
int maxRemovableEdges(int n, vector<vector<int> >& edges) {
unordered_set<int> vis_a;
unordered_set<int> vis_b;
unordered_set<int> vis_ab;
vector<vector<bool>> A_a(n, vector<bool>(n, false));
vector<vector<bool>> A_b(n, vector<bool>(n, false));
vector<vector<bool>> A_ab(n, vector<bool>(n, false));
for(auto edge : edges){
int type = edge[0], u = edge[1]-1, v = edge[2]-1;
if(A_ab[u][v]){
ret++;
continue;
}
if(type==3){
if(A_a[u][v]){
A_a[u][v] = false;
A_a[v][u] = false;
ret++;
}
if(A_b[u][v]){
A_b[u][v] = false;
A_b[v][u] = false;
ret++;
}
A_ab[u][v] = true;
A_ab[v][u] = true;
}
else if(type==1){
if(A_a[u][v]){
ret++;
}
else {
A_a[u][v] = true;
A_a[v][u] = true;
}
}
else if(type==2){
if(A_b[u][v]){
ret++;
}
else {
A_b[u][v] = true;
A_b[v][u] = true;
}
}
}
dfs(A_a, A_ab, vis_a, 0, -1);
if(vis_a.size()!=n) return -1;
dfs(A_b, A_ab, vis_b, 0, -1);
if(vis_b.size()!=n) return -1;
for(int i=0;i<n;i++){
if(!vis_ab.count(i)) dfs_both(A_ab, vis_ab, 0, -1);
}
return ret;
}
};
阿里巴巴公司氛围 652人发布
查看12道真题和解析