当前位置: 首页 > news >正文

代码随想录算法营Day59 | 寻找存在的路径, 冗余连接,冗余连接II

寻找存在的路径

这题使用并查集即可。并查集加路径压缩。

#include <iostream>
using namespace std;
int find(int* father,int u){
    return father[u] == u ? u : father[u] = find(father,father[u]);
}

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

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

int main(){
    int N,M,source,destination,u,v;
    cin >> N >> M;
    int father[N+1];
    for(int i=1;i<=N;i++){
        father[i] = i;
    }
    for(int i=0;i<M;i++){
        cin >> u >> v;
        join(father,u,v);
    }
    cin >> source >> destination;
    if(isSame(father,source,destination)){
        cout<<1;
    }
    else{
        cout<<0;
    }
}

冗余连接

这题也是并查集问题,删除那个导致图存在环的边,我们可以通过判断新加入的边的两个点是否存在同一个father,如果他们是同一个father,那就说明这两个点是已经加入图中的点,如果在这两个点之间加一条边的话会导致环的产生。而如果是新加入图的点那他们的祖先应该是不同的。

#include <iostream>
using namespace std;
int N;
int father[1001];

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

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

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

void join(int u,int v){
    u = find(u);
    v = find(v);
    if(u == v) return;
    father[v] = u;
}
int main(){
    int u,v;
    cin >> N;
    init();
    for(int i=0;i<N;i++){
        cin >> u >> v;
        if(isSame(u,v)){
            printf("%d %d",u,v);
            break;
        }
        else{
            join(u,v);
        }
    }
    
}

冗余连接II

这道题与上题逻辑类似,不过他变成了有向图,这里需要判断删除的边是否能继续保证图变成有向树即除了根节点,其余的节点的入度都得是1且不存在环。所以我们需要收集那些入度为2的节点,并尝试去删除其中的边,使有向图变成一个有向树。

#include <iostream>
#include <vector>
using namespace std;
int N;
int father[1001];
 
void init(){
    for(int i=1;i<=N;i++){
        father[i] = i;
    }
}
 
int find(int u){
    return father[u] == u ? u : father[u] = find(father[u]);
}
 
bool isSame(int u,int v){
    return find(u) == find(v);
}
 
void join(int u,int v){
    u = find(u);
    v = find(v);
    if(u == v) return;
    father[v] = u;
}

void getRemoveEdge(vector<vector<int>>& edges){
    init();
    for(vector<int>& v : edges){
        if(isSame(v[0],v[1])){
            printf("%d %d",v[0],v[1]);
            return;
        }
        else{
            join(v[0],v[1]);
        }
    }
}

bool isTreeAfterRemoveEdges(vector<vector<int>> &edges,int deleteEdge){
    init();
    for(int i=0;i<edges.size();i++){
        if(i==deleteEdge) continue;
        if(isSame(edges[i][0],edges[i][1])){
            return false;
        }
        join(edges[i][0],edges[i][1]);
    }
    return true;
}

int main(){
    int u,v;
    vector<vector<int>> edges;
    cin >> N;
    vector<int> inDegrees(N+1,0);
    for(int i=0;i<N;i++){
        cin >> u >> v;
        inDegrees[v]++;
        edges.push_back({u,v});
    }
    vector<int> vec;
    for(int i = N-1;i>=0;i--){
        if(inDegrees[edges[i][1]] == 2){
            vec.push_back(i);
        }
    }

    if(vec.size()>0){
        if(isTreeAfterRemoveEdges(edges,vec[0])){
            printf("%d %d",edges[vec[0]][0],edges[vec[0]][1]);
        }
        else{
            printf("%d %d",edges[vec[1]][0],edges[vec[1]][1]);
        }
        return 0;
    }

    getRemoveEdge(edges);
}

相关文章:

  • 使用eNSP进行路由策略与引入实验
  • Manus AI : Agent 元年开启.pdf
  • OpenHarmony子系统开发 - AI框架开发指导
  • 机器学习常见面试题
  • 第TR3周:Pytorch复现Transformer
  • 深入解析 JVM —— 从基础概念到实战调优的全链路学习指南
  • Permute for Mac v3.12.1 文件格式转换器 支持M、Intel芯片
  • 多模态知识图谱融合
  • golang将大接口传递给小接口以及场景
  • _mm_load_si128和_mm_loadu_si128解析
  • 一个针对煤炭市场的人工智能项目的开发示例
  • 详细GD32F103的FreeRTOS移植含常见错误
  • 基于火山引擎的DeepSeek-V3 api实现简单的数据查询功能
  • Python爬虫实战:爬取财金网实时财经信息
  • 2、数据库的基础学习(中):分组查询、连接查询 有小例子
  • CV毕业宝典[02_目标检测概述]
  • 山东省网络安全技能大赛历年真题 山东网络安全创意大赛
  • python从入门到精通(二十三):文件操作和目录管理难度分级练习题
  • 浅谈 DeepSeek 对 DBA 的影响
  • Python 性能优化:从入门到精通的实用指南
  • 属于垂直型b2b网站的有/seo优化软件
  • 企业门户网站建设论文/关键词有哪几种
  • 做最漂亮的网站/网上在哪里打广告最有效
  • 使用asp.net做购物网站/百度推广找谁做
  • 网站登录怎么退出/注册网站平台
  • 网站开发员纵向发展/长沙网络推广只选智投未来