当前位置:   article > 正文

算法训练营day70

算法训练营day70

题目1:108. 冗余连接 (kamacoder.com)

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int n;
  5. vector<int> father(10001, 0);
  6. void init() {
  7. for(int i = 1;i <= n;i++) father[i] = i;
  8. }
  9. int find(int u) {
  10. return u == father[u] ? u : father[u] = find(father[u]);
  11. }
  12. bool isSame(int u, int v) {
  13. u = find(u);
  14. v = find(v);
  15. return u == v;
  16. }
  17. void join(int u, int v) {
  18. u = find(u);
  19. v = find(v);
  20. if(u == v) return;
  21. father[v] = u;
  22. }
  23. int main() {
  24. cin >> n;
  25. init();
  26. int s, t;
  27. for(int i = 0;i < n;i++) {
  28. cin >> s >> t;
  29. if(isSame(s, t)) {
  30. cout << s << " " << t << endl;
  31. }else {
  32. join(s, t);
  33. }
  34. }
  35. return 0;
  36. }

题目2:109. 冗余连接II (kamacoder.com)

三种情况:入度为2的时候,有两种情况一种是删哪个都行,另一种是删掉之后可能出现环,这时候就要判断删除这个边,是否成环了

如果没有入度为2,就是成环,这个从前向后遍历,通过查并集删除删除连通的即可

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int n;
  5. vector<int> father(1001, 0);
  6. void init() {
  7. for(int i = 1;i <= n;i++) {
  8. father[i] = i;
  9. }
  10. }
  11. int find(int u) {
  12. return u == father[u] ? u : father[u] = find(father[u]);
  13. }
  14. bool same(int u, int v) {
  15. u = find(u);
  16. v = find(v);
  17. return u == v;
  18. }
  19. void join(int u, int v) {
  20. u = find(u);
  21. v = find(v);
  22. if(u == v) return;
  23. father[v] = u;
  24. }
  25. bool isTree(vector<vector<int>>& edge, int intnode) {
  26. init();
  27. for(int i = 0;i < n;i++) {
  28. if(i == intnode) continue;
  29. // 这里判断去掉这个边是否成环,这个实在入度为2的情况下
  30. if(same(edge[i][0], edge[i][1])) return false;
  31. else join(edge[i][0], edge[i][1]);
  32. }
  33. return true;
  34. }
  35. void getremovedge(vector<vector<int>>& edge) {
  36. init();
  37. for(int i = 0;i < n;i++) {
  38. if(same(edge[i][0], edge[i][1])) {
  39. cout << edge[i][0] << "" << edge[i][1] << endl;
  40. return;
  41. }else join(edge[i][0], edge[i][1]);
  42. }
  43. }
  44. int main() {
  45. cin >> n;
  46. vector<vector<int>> edge;
  47. vector<int> indgree(n + 1, 0);
  48. for(int i = 0;i < n;i++) {
  49. int s, t;
  50. cin >> s >> t;
  51. indgree[t]++;
  52. edge.push_back({s, t});
  53. }
  54. vector<int> vec;
  55. for(int i = n - 1;i >=0;i--) {
  56. if(indgree[edge[i][1]] == 2) {
  57. vec.push_back(i);
  58. }
  59. }
  60. if(vec.size() > 0) {
  61. if(isTree(edge, vec[0])) {
  62. cout << edge[vec[0]][0] << " " << edge[vec[0]][1] << endl;
  63. }else cout << edge[vec[1]][0] << " " << edge[vec[1]][1] << endl;
  64. return 0;
  65. }
  66. getremovedge(edge);
  67. return 0;
  68. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/798237
推荐阅读
相关标签
  

闽ICP备14008679号