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

关于图论的知识

如果一个无向图有 $n\times (n-1)\div 2$ 条边,称为**完全图**

如果一个完全图任意两个点都可以互相到达,称为**连通图**


一个包含 $dfs$ 与 $bfs$ 的图的遍历程序

程序可做到的:

1、每一行输出一个 **搜索树**

2、$dfs$ 与 $bfs$ 并存


```cpp
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n,m;//有n个节点,m条边 
vector<int> a[1005];
bool vis[1005];

void dfs(int u)
{
    vis[u] = true;
    cout<<u<<' ';
    for(int i=0;i<a[u].size();i++)
    {
        int v = a[u][i];
        if(vis[v]==false)
        {
            dfs(v);
        }
    }
}

void bfs(int u)
{
    queue<int> q;
    q.push(u);
    vis[u] = true;
    
    while(q.size())
    {
        u = q.front();
        cout<<u<<' ';
        q.pop();
        for(int i=0;i<a[u].size();i++)
        {
            int v = a[u][i];
            if(vis[v]==false)
            {
                q.push(v);
                vis[v] = true;
            }
        }
    }
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        
        a[u].push_back(v);
        a[v].push_back(u);    
    }    
    
    for(int i=1;i<=n;i++)
    {
        if(vis[i]==false)
        {
            //dfs(i);
            bfs(i);
            cout<<endl;
        }
    }
    return 0;
}
```


实际上,也可以用 $list$ 链表,也就是前向星,它避免了缺点收集了优点

```cpp
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e4+5;
struct node
{
    int u;
    int v;
    int next;    
}a[N];
int n,m;//m条边,节点的编号为1~n
int tot;
int head[N];
int vis[N];

void add(int u,int v)
{
    a[++tot].u = u;
    a[tot].v = v;
    a[tot].next = head[u];
    head[u] = tot;
}

void dfs(int u)
{
    cout<<u<<' ';
    vis[u] = true;
    
    for(int i=head[u];i!=-1;i=a[i].next)
    {
        int v = a[i].v;
        if(vis[v]==false)
        {
            dfs(v);
        }
    }
}

int main()
{
    memset(head,-1,sizeof(head));
    cin>>n>>m;
    for(int i=1;i<=m;i++)//m条边
    {
        int u,v;
        cin>>u>>v;
        
        add(u,v);
        add(v,u);
    }
    
    for(int i=1;i<=n;i++)
    {
        if(vis[i]) continue;
        dfs(i);
        cout<<endl;
    }
    return 0;
}
```

然后就是判环代码,实际上就是看当前 $u$ 节点是否被访问过即 $vis[u]==true$ ,但注意父节点不要误判为环了


```cpp
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n,m;//有n个节点,m条边 
vector<int> a[1005];
bool vis[1005];

void dfs(int u,int f)
{
    vis[u] = true;
//    cout<<u<<' ';
    for(int i=0;i<a[u].size();i++)
    {
        int v = a[u][i];
        if(vis[v]==false) dfs(v,u);
        else if(v!=f)
        {
            cout<<"have circle";
            exit(0);
        }
    }
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        
        a[u].push_back(v);
        a[v].push_back(u);    
    }    
    
    for(int i=1;i<=n;i++)
    {
        if(vis[i]==false)
        {
            dfs(i,-1);
        }
    }
    cout<<"have no circle";
    return 0;
}


```

很明显,上面的代码是一个无向图的代码,所以我再编写一个有向图的


```cpp
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n,m;//有n个节点,m条边 
vector<int> a[1005];
int vis[1005];
/*定义vis[i]为i节点的访问状态,0=未访问,1=正在访问,-1=访问过且已经结束*/

void dfs(int u)
{
    vis[u] = 1;
//    cout<<u<<' ';
    for(int i=0;i<a[u].size();i++)
    {
        int v = a[u][i];
        if(vis[v]==0) dfs(v);
        if(vis[v]==1)
        {
            cout<<"have circle";
            exit(0);
        }
    }
    vis[u] = -1;
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        
        a[u].push_back(v);//这是一个有向图 
        //a[v].push_back(u);    
    }    
    
    for(int i=1;i<=n;i++)
    {
        if(vis[i]==0) dfs(i);
    }
    cout<<"have no circle";
    return 0;
}
```

http://www.xdnf.cn/news/2138.html

相关文章:

  • 2025.4.26总结
  • GitOps进化:深入探讨 Argo CD 及其对持续部署的影响
  • 图像特征检测算法对比及说明
  • FPGA前瞻篇-数字电路基础-逻辑门电路设计
  • ssm乡村合作社商贸网站设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
  • 【C】初阶数据结构13 -- 快速排序
  • Pygame物理模拟:实现重力、弹跳与简单物理引擎
  • DAM-3B,英伟达推出的多模态大语言模型
  • IntelliJ IDEA 2025.2 和 JetBrains Rider 2025.1 恢复git commit为模态窗口
  • 23种设计模式-行为型模式之迭代器模式(Java版本)
  • 测试基础笔记第十三天
  • 工业摄像头通过USB接口实现图像
  • STL中emplace实现原理是什么?
  • 240426 leetcode exercises
  • springboot入门-controller层
  • IT社团分析预测项目(pandas、numpy、sklearn)
  • PMP-第一章 引论
  • 基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述
  • 微信小程序,基于uni-app的轮播图制作,调用文件中图片
  • 【计算机网络】TCP的四种拥塞控制算法
  • 深圳举办2025年全国儿童预防接种日主题宣传活动 全生命周期健康守护再升级
  • Win下Pycharm运行/调试配置脚本形参执行替换Linux下终端执行,进行调试需要注意的
  • MyBatis XML 配置完整示例(含所有核心配置项)
  • Unity中数据储存
  • 【Linux】Centos7 安装 Docker 详细教程
  • 7.学习笔记-Maven进阶(P75-P89)-进度(p75-P80)
  • Prometheus、Zabbix 和 Nagios 这三个工具的对100个节点的部署设计的信息流
  • Python Cookbook-6.11 缓存环的实现
  • 深入理解TransmittableThreadLocal:原理、使用与避坑指南
  • java智慧城管综合管理系统源码,前端框架:vue+element;后端框架:springboot;移动端:uniapp开发,技术前沿,可扩展性强