首页 > 其他分享 >图论基础实现

图论基础实现

时间:2024-08-09 16:08:43浏览次数:12  
标签:图论 vis 实现 基础 head 链表 int edge push

图的存储

使用邻接表来存储

#include <bits/stdc++.h>
using namespace std;
struct edge{
    int u,v;
};
vector<edge>e;
int n,m;//n个点,m条边

//如何证明一条边存在呢?直接枚举即可
bool find_edge(int u,int v)
{
    for(int i=1;i<=m;i++)
    if(e[i].u==u&&e[i].v==v) return true;
    return false;
}

//使用邻接表来实现这张图
int main()
{
    cin>>n>>m;
    e.resize(m+1);
    for(int i=1;i<=m;i++)
    {
        cin>>e[i].u>>e[i].v;
    }
}

使用邻接矩阵来存储

配合动态数组

#include <bits/stdc++.h>
using namespace std;

int n,m;//n个点,m条边

vector<vector<int> >adj;

bool find_edge(int u,int v)
{
    return adj[u][v];
}


//使用邻接矩阵来实现这张图
int main()
{
    cin>>n>>m;
    adj.resize(n+1);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        //若为无向图 adj[v].push_back(u);
    }
}

链式前向星

1.这个知识点需要学习一下链表的知识,否则不好理解。
2.我们把每条边看成了一个结点,这个结点存v,w,next,然后head数组,每一个head[i]相当于每一条链表的头节点指向的下一个地址,i相当于第i条链表,每一条链表存的对应的边的集合,通过next连接起来。
3.建议画图去实现一下,会发现就是类似于链表的头插法。实在不会b站搜视频看看。

#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m,idx;
//相当于头插法
 struct Edge{
    int to;//到达点
    int w;//边权
    int next;//同一个边集合中的下一个边点索引
    //可以理解成链表中的下一个节点的地址
}edge[N];

int head[N];//i相当于第几个链表,head[i]的值相当于链表中的头节点指向的下一个节点的地址

void add(int u,int v, int w)
{
    edge[idx].to=v;
    edge[idx].w=w;
    edge[idx].next=head[u];//类似更新指针
    head[u]=idx++;//更新链表的头节点的下一个地址
    
}

int main()
{
    memset(head,-1,sizeof head);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);//加边
        /*
        无向图
        add(u,v,w);
        add(v,u,w);
        
        */
    }
    
    //遍历所有边
    for(int i=1;i<=n;i++)
    {
        for(int j=head[i];j!=-1;j=edge[i].next)
        {
            //添加代码
        }
    }
    
    
    
    
}

拿邻接表为例写出dfs遍历

#include <bits/stdc++.h>
using namespace std;
vector<vector<int> >edge;
bool vis[10005];
int n,m;//n个点,m条边
//用栈来实现
void dfs(int x)
{
    stack<int>st;
    st.push(x);
    vis[x]=1;
    while(!st.empty())
    {
        int from=st.top();
        st.pop();
        for(auto to:edge[from])
        {
            if(!vis[to]){
                vis[to]=true;
                st.push(to);
            }
        }
    }
    
}
/*
//写成递归
void dfs(int u)
{
    vis[u]=1;
    for(auto t:edge[u])
    {
        if(!vis[t]) dfs(t);
    }
}
*/



//使用邻接表来实现这张图
int main()
{
    cin>>n>>m;
    edge.resize(n+1);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        edge[u].push_back(v);
    }
}

拿邻接表为例写出bfs遍历

#include <bits/stdc++.h>
using namespace std;
vector<vector<int> >edge;
bool vis[10005];
int n,m;//n个点,m条边
void bfs(int x)
{
    queue<int>q;
    q.push(x);
    vis[x]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(auto t:edge[u])
        {
            if(!vis[t]){
                vis[t]=1;
                q.push(v);
            }
        }
    }
    
}


int main()
{
    cin>>n>>m;
    edge.resize(n+1);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        edge[u].push_back(v);
    }
}

标签:图论,vis,实现,基础,head,链表,int,edge,push
From: https://www.cnblogs.com/swjswjswj/p/18350422

相关文章

  • Vue3实现印章徽章组件
    1、组件结构2、组件封装src/components/StampBadge/src/StampBadge.vue文件代码<template><divclass="first-ring"v-bind="getBindValue":class="getStampBadgeClass"><divclass="second-ri......
  • Applescript实现无痕检测是否注册iMessage服务,iMessages数据筛选,iMessage蓝号检测完
    一、实现iMessage蓝号数据筛选的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2.编写脚本......
  • SpringBoot基础 - 准备工作(打包成可运行的jar)
    目录A.简介B.下载一.配置本地Maven二.修改阿里云maven镜像三. 导入SpringBoot的相关依赖C.例子D.快捷使用A.简介SpringBoot是一种用于简化Spring应用开发的框架,它具有以下特点和优势:一、简化配置传统Spring应用配置的复杂性:在传统的Spring......
  • 2024黑客从零基础入门到精通(超详细),看完这一篇就够了
    首先要明白啊,我们现在说的黑客不是那种窃取别人信息、攻击别人系统的黑客,说的是调试和分析计算机安全系统的网络安全工程师。黑客技术的核心就是渗透攻防技术,是为了证明网络防御按照预期计划正常运行而提供的一种机制。就是通过模拟恶意黑客的攻击方法,来评估计算机网络系统......
  • 医疗业务DICOM协议的基础内容
    dicomDICOM协议是医疗领域对如何处理、存储、打印和传输医疗图片的一系列标准。DICOM是DigitalImagingandCommunicationsinMedicine的缩写,它包括一个文件存储定义和一个通讯协议。AE(ApplicationEntity)代表DICOM通信中的一个终端,可以代表一个系统或者一个程序。......
  • html+css 实现hover中间展开背景
    前言:哈喽,大家好,今天给大家分享html+css绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • Neo4j 实现一个简单的CMDB管理平台
    简介Neo4j是一个高性能的图形数据库管理系统,它使用图形模型来存储和查询数据。图形数据库与传统的关系型数据库不同,它们使用节点和边来表示数据实体和它们之间的关系,而不是使用表格和行,可以使用neo4j实现权限系统,知识图谱,cmdb等部署dockerrun-d--name=neo4j\--publis......
  • 零基础学习人工智能—Python—Pytorch学习(三)
    前言这篇文章主要两个内容。一,把上一篇关于requires_grad的内容补充一下。二,介绍一下线性回归。关闭张量计算关闭张量计算。这个相对简单,阅读下面代码即可。print("============关闭require_grad==============")x=torch.randn(3,requires_grad=True)print(x)x.requir......
  • Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
    什么是面向对象编程(OOP)?OOP代表面向对象编程。过程式编程是编写执行数据操作的过程或方法,而面向对象编程则是创建包含数据和方法的对象。与过程式编程相比,面向对象编程具有以下几个优势:OOP更快且更易于执行OOP为程序提供了清晰的结构OOP有助于保持Kotlin代码的DRY......
  • 华为防火墙NAT源地址转换基础配置详解
      本次实验主要针对防火墙NAT基本的配置进行详解,内容主要有防火墙EasyIPNAT的基础配置和NAPT以及NO-PAT基本配置实验最后再通过防火墙NAT服务器映射转换。1.1实验拓扑:1.2NAT实验地址规划表:序号设备名称接口IP地址/掩码1出口防火墙GE0/0/0192.168........