day56 第十一章:图论part06

108.冗余连接

注意init初始化

改进:

其实只有一条边冗余,改为,如果两条边在同一个集合里,就输出,不然加入。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int n = 1005;
vector<int> father(n,0);

void init(){
    for (int i=0;i<n;i++){
        father[i] = i;
    }
}

int find(int u){
    return u == father[u]? u: father[u] = find(father[u]);
}

bool isSame(int u, int v){
    u = find(u);
    v =  find(v);
    return u == v;
}

void join(int u, int v){
    u = find(u);
    v = find(v);
    if(u==v){
        return;
    }
    father[u] = v;
}

int main(){
    
    int N;
    cin >>N;
    init(); //1111

    int s,t,redun_s, redun_t;
    bool result;
    while(N--){
        cin>>s>>t;
        result = isSame(s,t);
        if (result){
            redun_s = s;
            redun_t = t;
        }
        join(s,t);
    }
    cout << redun_s <<" "<< redun_t << endl;
    
    
    return 0;
}

109.冗余连接II

不好做:

1.入度为2:看删哪条边可以形成树,而不是环(因为只有两种可能,一个树,一个环)

2.没有入度为2的点:有向环,删最后形成环的那条

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int n;
vector<int> father(1001, 0);

void init() {
    for (int i = 0; i < n; i++) {
        father[i] = i;
    }
}

int find(int u) {
    return u == father[u] ? u : father[u] = find(father[u]);
}

bool isSame(int u, int v) {
    u = find(u);
    v = find(v);
    return u == v;
}

void join(int u, int v) {
    u = find(u);
    v = find(v);
    if (u == v) {
        return;
    }
    father[v] = u;
}

bool isTreeAfterRemoveVec(const vector<vector<int>>& edges, int v) {
    init();
    for (int i = 0; i < n; i++) {
        if (i == v) {
            continue;
        }
        if (isSame(edges[i][0], edges[i][1])) {
            return false;
        }
        join(edges[i][0], edges[i][1]);
    }

    return true;
}

void getRemoveEdge(const vector<vector<int>>& edges) {
    init();
    for (int i = 0; i < n; i++) {
        if (isSame(edges[i][0], edges[i][1])) {
            cout << edges[i][0] << " " << edges[i][1];
            return;
        }
        join(edges[i][0], edges[i][1]);
    }
}

int main() {

    // int N;
    cin >> n;
    // init(); //1111
    
    // n = 3;
    // vector<vector<int>> grid;
    // grid = {
    //     {1,2},
    //     {1,3},
    //     {2,3}
    // };


    vector<vector<int>> edges;
    vector<int> degrees(n+1, 0);

    int s, t;
    for(int i=0;i<n;i++) {
        cin >> s >> t;
        // s = grid[i][0];
        // t = grid[i][1];

        edges.push_back({ s,t });
        degrees[t]++;

    }

    //计算入度
    vector<int> vec;
    for (int i = 0; i < n; i++) {
        //cout << degrees[edges[i][1]] << " ";
        if (degrees[edges[i][1]] == 2) {
            vec.push_back(i);
        }
    }
    
    //情况1:入度为2,看删哪个
    if (vec.size() > 1) {
        if (isTreeAfterRemoveVec(edges, vec[1])) {
            cout << edges[vec[1]][0] << " " << edges[vec[1]][1] << endl;
        }
        else {
            cout << edges[vec[0]][0] << " " << edges[vec[0]][1] << endl;
        }
        return 0;
    }

    //情况2:有向环
    getRemoveEdge(edges);

    return 0;
}
相关推荐
Trouvaille ~4 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
偷吃的耗子9 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
坚果派·白晓明15 分钟前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
小镇敲码人22 分钟前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
dazzle1 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵1 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强1 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发1 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
小镇敲码人1 小时前
探索CANN框架中TBE仓库:张量加速引擎的优化之道
c++·华为·acl·cann·ops-nn
张登杰踩1 小时前
MCR ALS 多元曲线分辨算法详解
算法