题解 | #动物牛的探险之旅#
动物牛的探险之旅
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; } };