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

图论day60|108.冗余连接(卡码网) 、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】

图论day60|108.冗余连接(卡码网)、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】

    • 108.冗余连接(卡码网)
    • 109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】

108.冗余连接(卡码网)

题目描述

有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图:

img

现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图:

img

先请你找出冗余边,删除后,使该图可以重新变成一棵树。

输入描述

第一行包含一个整数 N,表示图的节点个数和边的个数。

后续 N 行,每行包含两个整数 s 和 t,表示图中 s 和 t 之间有一条边。

输出描述

输出一条可以删除的边。如果有多个答案,请删除标准输入中最后出现的那条边。

输入示例

3
1 2
2 3
1 3

输出示例

1 3

提示信息

img

图中的 1 2,2 3,1 3 等三条边在删除后都能使原图变为一棵合法的树。但是 1 3 由于是标准输出里最后出现的那条边,所以输出结果为 1 3

数据范围:

1 <= N <= 1000.

在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;

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

void init()
{
    for(int i=1;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;
    else
        father[v]=u;
}

int main()
{
    cin>>n;
    init();
    int s,t;
    for(int i=0;i<n;i++)
    {
        cin>>s>>t;
        if(isSame(s,t))
        {
            cout<<s<<" "<<t<<endl;
            return 0;
        }
        else
            join(s,t);
    }
}

109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】

题目描述

有一种有向树,该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。如图:

img

现在有一个有向图,有向图是在有向树中的两个没有直接链接的节点中间添加一条有向边。如图:

img

输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。

输入描述

第一行输入一个整数 N,表示有向图中节点和边的个数。

后续 N 行,每行输入两个整数 s 和 t,代表这是 s 节点连接并指向 t 节点的单向边

输出描述

输出一条可以删除的边,若有多条边可以删除,请输出标准输入中最后出现的一条边。

输入示例

3
1 2
1 3
2 3

输出示例

2 3

提示信息

img

在删除 2 3 后有向图可以变为一棵合法的有向树,所以输出 2 3

数据范围:

1 <= N <= 1000.

在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;

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

void init()
{
    for(int i=1;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;
    else
        father[v]=u;
}

bool deleteIsTree(vector<vector<int>> edges,int x)
{
    init();
    for(int i=0;i<n;i++)
    {
        if(i==x) continue;
        if(isSame(edges[i][0],edges[i][1]))
            return false;
        else
            join(edges[i][0],edges[i][1]);
    }
    return true;
}

void removeEdge(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]<<endl;
        else
            join(edges[i][0],edges[i][1]);
    }
}

int main()
{
    int s,t;
    cin>>n;
    vector<vector<int>> edges;
    vector<int> inDegree(n+1,0);
    vector<int> vec;

    for(int i=0;i<n;i++)
    {
        cin>>s>>t;
        edges.push_back({s,t});
        inDegree[t]++;
    }

    for(int i=n-1;i>0;i--)
    {
        if(inDegree[edges[i][1]]==2)
            vec.push_back(i);
    }

    if(vec.size()>0)
    {
        if(deleteIsTree(edges,vec[0]))
            cout<<edges[vec[0]][0]<<" "<<edges[vec[0]][1]<<endl;
        else
            cout<<edges[vec[1]][0]<<" "<<edges[vec[1]][1]<<endl;
    return 0;
    }

    removeEdge(edges);
}

http://www.kler.cn/news/358517.html

相关文章:

  • 013_django基于大数据的高血压人群分析系统2024_dcb7986h_055
  • 大数据开发基于Hadoop+springboot平台的岗位推荐系统
  • 帝国cms取得内容和栏目链接地址的方法
  • 波浪理论(Elliott Wave Theory)
  • win10专业版电脑.net framework3.5sp1进度条不动如何开启
  • IO编程--两进程间的实时通信
  • 6-4.Android 对话框之进度对话框问题清单(UI 线程问题、外部取消、dismiss 方法与 hide 方法)
  • MySQL-21.多表设计-案例-关系分析-表结构
  • 数据结构与算法——Java实现 41.对称二叉树
  • 基于FPGA的信号发生器verilog实现,可以输出方波,脉冲波,m序列以及正弦波,可调整输出信号频率
  • 2024-10-15 问AI: [AI面试题] 人工智能中使用了哪些不同的搜索算法?
  • 《Windows PE》7.3 遍历资源表
  • PostgreSQL学习笔记:PostgreSQL vs MySQL
  • 汽车票在线预订:SpringBoot技术实践
  • 探索程序之道:为什么要开发程序
  • R语言详解predict函数
  • Python 网络爬虫入门与实战
  • [C#][winform]基于yolov8的8种人脸表情检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
  • copliot竞品——豆包MarsCode
  • YoloV10改进策略:注意力改进|DeBiFormer,可变形双级路由注意力|引入DeBiLevelRoutingAttention注意力模块(全网首发)