首页 > 其他分享 >求解连通图问题的常用方法

求解连通图问题的常用方法

时间:2023-01-09 11:57:34浏览次数:70  
标签:连通 idx 求解 int ne 常用 st add while

判断图是否连通以及连通子图个数的问题

一般常见的解法是 并查集或者图的遍历(dfs/bfs)

连通图

经典并查集写法

#include <bits/stdc++.h>
using namespace std;
const int N = 1010,M = 5050;
int p[N];
int find(int x)
{
    if (p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int n,m;
    while (cin>>n>>m)
    {
        for (int i=1;i<=n;i++) p[i]=i;
        while (m--)
        {
            int a,b;
            cin>>a>>b;
            int pa = find(a),pb = find(b);
            if (pa!=pb)
                p[pa]=pb;
        }
        
        bool flag = false;
        int ans = find(1);
        for (int i=2;i<=n;i++)
        {
            if (find(i)!=ans)
            {
                flag = true;
                break;
            }
        }
        if (flag) puts("NO");
        else puts("YES");
    }
    return 0;
}

dfs遍历

#include <bits/stdc++.h>
using namespace std;
const int N = 1010,M = N*N;
int h[N],e[M],ne[M],idx;
bool st[N];
int n,m;
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u)
{
    st[u] = true;
    for (int i=h[u];~i;i=ne[i])
    {
        int j = e[i];
        if (!st[j])
            dfs(j);
    }
}
int main()
{
    while (cin>>n>>m)
    {
        memset(h,-1,sizeof h);
        memset(st,0,sizeof st);
        while (m--)
        {
            int a,b;
            cin>>a>>b;
            add(a,b),add(b,a);
        }
        dfs(1);
        bool flag = false;
        for (int i=1;i<=n;i++)
        {
            if (!st[i])
            {
                flag = true;
                break;
            }
        }
        if (flag) puts("NO");
        else puts("YES");
    }
    return 0;
}

bfs遍历

#include <bits/stdc++.h>
using namespace std;
const int N = 1010,M = N*N;
int h[N],e[M],ne[M],idx;
int n,m;
bool st[N];

void add(int a,int b)
{
    e[idx] =b,ne[idx]=h[a],h[a]=idx++;
}
void bfs(int u)
{
    queue<int>q;
    st[u] = true;
    q.push(u);
    while (q.size())
    {
        auto t = q.front();
        q.pop();
        for (int i=h[t];~i;i=ne[i])
        {
            int j = e[i];
            if (!st[j])
            {
                st[j] = true;
                q.push(j);
            }
        }
    }
}
int main()
{
    while (cin>>n>>m)
    {
        memset(h,-1,sizeof h);
        memset(st,0,sizeof st);
        while (m--)
        {
            int a,b;
            cin>>a>>b;
            add(a,b),add(b,a);
        }
        
        bfs(1);
        bool flag = false;
        for (int i=1;i<=n;i++)
        {
            if (!st[i])
            {
                flag = true;
                break;
            }
        }
        if (flag) puts("NO");
        else puts("YES");
    }
    return 0;
}

标签:连通,idx,求解,int,ne,常用,st,add,while
From: https://www.cnblogs.com/sdnu-dfl/p/17036582.html

相关文章

  • 【linux】linux Centos8系统,防火墙配置常用命令,systemctl 和firewall
    本文环境:Linux系统CentOS8.264bitCentOS7版本及以上版本较centos6有较大改动,例如:采用systemctl命令来开启service,它是服务管理中主要的工具,融合了之前service和chkconf......
  • Git配置免密登录及常用操作的详细教程(基于Gitee平台)
    (文章目录)前言我这里使用的是vuecli创建的项目进行代码管理,使用的平台是Gitee。平台的话其实最推荐使用的平台还是GitHub(但是因为国内连接不稳定的原因放弃使用),因为Git......
  • MySQL 常用脚本
    1.导出整个数据库 1mysqldump -u 用户名 -p –default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1)  23mysqldump -u wcnc -p s......
  • pom.xml经常用到去写的坐标
    tomcat7插件1<plugin>2<groupId>org.apache.tomcat.maven</groupId>3<artifactId>tomcat7-maven-plugin</artifactId>4</plugin>jdk17坐标,因......
  • docker-compose常用命令
    build:本地创建镜像command:覆盖缺省命令depends_on:链接容器ports:暴露端口volumes:卷image:pull镜像up:启动stop:停止rm:删除logs:查看日志ps:列出服务相关容器 ......
  • 四个常用的域对象
    四个常用的域对象:看了下web课上的PPT,我承认之前太大声了╥﹏╥四大域对象常用的四大域,即pageContext,request,session,application功能:都是存取数据,但对数据的存取范围不同......
  • C#枚举的常用用法
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApp3{enummyenu......
  • Windchill_二次开发新手入门常用的API
    Windchill_二次开发新手入门常用的API 1.根据零件名称/编码得到该零件   wt.clients.prodmgmt.WTPartHelper.findPartByName(name);   wt.clients.prodm......
  • HTML_2_常用head标签
    head标签是html组成的一个部分,主要用于配置页面信息。  标题标签:<title>网页标题!</title>编码格式标签:<!--编码配置:html5--><metacharset="UTF-8"><!--编......
  • python常用命令
    使用pip-review库(推荐)安装库pipinstallpip-review检查是否有需要更新的包>pip-reviewscikit-learn==0.23.2isavailable(youhave0.23.1)scipy==1.5.4isavail......