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

图简记。。

模仿: 

algorithm-journey/src/class059/Code01_CreateGraph.java at main · algorithmzuo/algorithm-journey

Code01_CreateGraph

 C语言:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAXN 11
#define MAXM 21// 邻接矩阵
int graph1[MAXN][MAXN];// 邻接表
typedef struct EdgeNode {int to;int weight;struct EdgeNode* next;
} EdgeNode;EdgeNode* graph2[MAXN];// 链式前向星
int head[MAXN];
int next[MAXM];
int to[MAXM];
int weight[MAXM];
int cnt;// 初始化图
void build(int n) {// 邻接矩阵初始化for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {graph1[i][j] = 0;}}// 邻接表初始化for (int i = 0; i <= n; i++) {graph2[i] = NULL;}// 链式前向星初始化cnt = 1;memset(head, 0, sizeof(head));
}// 链式前向星添加边
void addEdge(int u, int v, int w) {next[cnt] = head[u];to[cnt] = v;weight[cnt] = w;head[u] = cnt++;
}// 添加邻接表边
void addAdjListEdge(int u, int v, int w) {EdgeNode* newNode = (EdgeNode*)malloc(sizeof(EdgeNode));newNode->to = v;newNode->weight = w;newNode->next = graph2[u];graph2[u] = newNode;
}// 有向图构建
void directGraph(int edges[][3], int edgeCount) {// 邻接矩阵for (int i = 0; i < edgeCount; i++) {graph1[edges[i][0]][edges[i][1]] = edges[i][2];}// 邻接表for (int i = 0; i < edgeCount; i++) {addAdjListEdge(edges[i][0], edges[i][1], edges[i][2]);}// 链式前向星for (int i = 0; i < edgeCount; i++) {addEdge(edges[i][0], edges[i][1], edges[i][2]);}
}// 无向图构建
void undirectGraph(int edges[][3], int edgeCount) {// 邻接矩阵for (int i = 0; i < edgeCount; i++) {graph1[edges[i][0]][edges[i][1]] = edges[i][2];graph1[edges[i][1]][edges[i][0]] = edges[i][2];}// 邻接表for (int i = 0; i < edgeCount; i++) {addAdjListEdge(edges[i][0], edges[i][1], edges[i][2]);addAdjListEdge(edges[i][1], edges[i][0], edges[i][2]);}// 链式前向星for (int i = 0; i < edgeCount; i++) {addEdge(edges[i][0], edges[i][1], edges[i][2]);addEdge(edges[i][1], edges[i][0], edges[i][2]);}
}// 遍历图
void traversal(int n) {printf("邻接矩阵遍历 :\n");for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {printf("%d ", graph1[i][j]);}printf("\n");}printf("邻接表遍历 :\n");for (int i = 1; i <= n; i++) {printf("%d(邻居、边权) : ", i);EdgeNode* current = graph2[i];while (current != NULL) {printf("(%d,%d) ", current->to, current->weight);current = current->next;}printf("\n");}printf("链式前向星 :\n");for (int i = 1; i <= n; i++) {printf("%d(邻居、边权) : ", i);for (int ei = head[i]; ei > 0; ei = next[ei]) {printf("(%d,%d) ", to[ei], weight[ei]);}printf("\n");}
}// 释放邻接表内存
void freeAdjList(int n) {for (int i = 1; i <= n; i++) {EdgeNode* current = graph2[i];while (current != NULL) {EdgeNode* temp = current;current = current->next;free(temp);}}
}int main() {// 有向图示例int n1 = 4;int edges1[][3] = { {1, 3, 6}, {4, 3, 4}, {2, 4, 2}, {1, 2, 7}, {2, 3, 5}, {3, 1, 1} };build(n1);directGraph(edges1, 6);traversal(n1);freeAdjList(n1);printf("==============================\n");// 无向图示例int n2 = 5;int edges2[][3] = { {3, 5, 4}, {4, 1, 1}, {3, 4, 2}, {5, 2, 4}, {2, 3, 7}, {1, 5, 5}, {4, 2, 6} };build(n2);undirectGraph(edges2, 7);traversal(n2);freeAdjList(n2);return 0;
}

 C++版本:

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;const int MAXN = 11;
const int MAXM = 21;// 邻接矩阵
int graph1[MAXN][MAXN];// 邻接表
struct Edge {int to;int weight;
};vector<Edge> graph2[MAXN];// 链式前向星
int head[MAXN];
int next[MAXM];
int to[MAXM];
int weight[MAXM];
int cnt;// 初始化图
void build(int n) {// 邻接矩阵初始化for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {graph1[i][j] = 0;}}// 邻接表初始化for (int i = 0; i <= n; i++) {graph2[i].clear();}// 链式前向星初始化cnt = 1;memset(head, 0, sizeof(head));
}// 链式前向星添加边
void addEdge(int u, int v, int w) {next[cnt] = head[u];to[cnt] = v;weight[cnt] = w;head[u] = cnt++;
}// 有向图构建
void directGraph(vector<vector<int>> edges) {// 邻接矩阵for (auto edge : edges) {graph1[edge[0]][edge[1]] = edge[2];}// 邻接表for (auto edge : edges) {graph2[edge[0]].push_back({edge[1], edge[2]});}// 链式前向星for (auto edge : edges) {addEdge(edge[0], edge[1], edge[2]);}
}// 无向图构建
void undirectGraph(vector<vector<int>> edges) {// 邻接矩阵for (auto edge : edges) {graph1[edge[0]][edge[1]] = edge[2];graph1[edge[1]][edge[0]] = edge[2];}// 邻接表for (auto edge : edges) {graph2[edge[0]].push_back({edge[1], edge[2]});graph2[edge[1]].push_back({edge[0], edge[2]});}// 链式前向星for (auto edge : edges) {addEdge(edge[0], edge[1], edge[2]);addEdge(edge[1], edge[0], edge[2]);}
}// 遍历图
void traversal(int n) {cout << "邻接矩阵遍历 :" << endl;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cout << graph1[i][j] << " ";}cout << endl;}cout << "邻接表遍历 :" << endl;for (int i = 1; i <= n; i++) {cout << i << "(邻居、边权) : ";for (auto edge : graph2[i]) {cout << "(" << edge.to << "," << edge.weight << ") ";}cout << endl;}cout << "链式前向星 :" << endl;for (int i = 1; i <= n; i++) {cout << i << "(邻居、边权) : ";for (int ei = head[i]; ei > 0; ei = next[ei]) {cout << "(" << to[ei] << "," << weight[ei] << ") ";}cout << endl;}
}int main() {// 有向图示例int n1 = 4;vector<vector<int>> edges1 = { {1, 3, 6}, {4, 3, 4}, {2, 4, 2}, {1, 2, 7}, {2, 3, 5}, {3, 1, 1} };build(n1);directGraph(edges1);traversal(n1);cout << "==============================" << endl;// 无向图示例int n2 = 5;vector<vector<int>> edges2 = { {3, 5, 4}, {4, 1, 1}, {3, 4, 2}, {5, 2, 4}, {2, 3, 7}, {1, 5, 5}, {4, 2, 6} };build(n2);undirectGraph(edges2);traversal(n2);return 0;
}

 Code02_TopoSortDynamicLeetcode

C版本:

#include <stdio.h>
#include <stdlib.h>// 定义邻接表节点结构
typedef struct Node {int vertex;struct Node* next;
} Node;// 添加新节点到邻接表
Node* addNode(int v) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->vertex = v;newNode->next = NULL;return newNode;
}int* findOrder(int numCourses, int** prerequisites, int prerequisitesSize, int* prerequisitesColSize, int* returnSize) {// 创建邻接表Node** graph = (Node**)malloc(numCourses * sizeof(Node*));for (int i = 0; i < numCourses; i++) {graph[i] = NULL;}// 创建入度表int* indegree = (int*)calloc(numCourses, sizeof(int));// 构建图和入度表for (int i = 0; i < prerequisitesSize; i++) {int ai = prerequisites[i][0];int bi = prerequisites[i][1];Node* newNode = addNode(ai);newNode->next = graph[bi];graph[bi] = newNode;indegree[ai]++;}// 创建队列int* queue = (int*)malloc(numCourses * sizeof(int));int l = 0, r = 0;// 将入度为0的节点入队for (int i = 0; i < numCourses; i++) {if (indegree[i] == 0) {queue[r++] = i;}}// 拓扑排序int cnt = 0;while (l < r) {int cur = queue[l++];cnt++;Node* temp = graph[cur];while (temp != NULL) {int next = temp->vertex;if (--indegree[next] == 0) {queue[r++] = next;}temp = temp->next;}}// 释放内存for (int i = 0; i < numCourses; i++) {Node* temp = graph[i];while (temp != NULL) {Node* next = temp->next;free(temp);temp = next;}}free(graph);free(indegree);// 返回结果if (cnt == numCourses) {*returnSize = numCourses;return queue;} else {*returnSize = 0;free(queue);return NULL;}
}

C++版本:

#include <vector>
#include <queue>
using namespace std;vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {// 创建邻接表vector<vector<int>> graph(numCourses);// 创建入度表vector<int> indegree(numCourses, 0);// 构建图和入度表for (const auto& edge : prerequisites) {int ai = edge[0];int bi = edge[1];graph[bi].push_back(ai);indegree[ai]++;}// 创建队列queue<int> q;// 将入度为0的节点入队for (int i = 0; i < numCourses; i++) {if (indegree[i] == 0) {q.push(i);}}// 拓扑排序vector<int> result;int cnt = 0;while (!q.empty()) {int cur = q.front();q.pop();result.push_back(cur);cnt++;for (int next : graph[cur]) {if (--indegree[next] == 0) {q.push(next);}}}// 返回结果if (cnt == numCourses) {return result;} else {return {};}
}

 

相关文章:

图简记。。

模仿&#xff1a; algorithm-journey/src/class059/Code01_CreateGraph.java at main algorithmzuo/algorithm-journey Code01_CreateGraph C语言&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAXN 11 #define MAX…...

pytorch基本运算-范数

引言 前序学习进程中&#xff0c;已经对pytorch基本运算有了详细探索&#xff0c;文章链接有&#xff1a; 基本运算 广播失效 乘除法和幂运算 hadamard积、点积和矩阵乘法 上述计算都是以pytorch张量为运算元素&#xff0c;这些张量基本上也集中在一维向量和二维矩阵&#x…...

uefi协议设计目的

在EDK2的术语体系中&#xff0c;GUID定义的是协议的标识符&#xff0c;而具体实现的函数集合称为协议的实现。它们是同一协议的不同抽象层次&#xff0c;以下是详细解释&#xff1a; 1. 协议&#xff08;Protocol&#xff09;的两层含义 (1) 协议规范&#xff08;接口定义&am…...

springcloud openfeign 偶现 Caused by: java.net.UnknownHostException

背景 最近查看日志发现某服务偶现Caused by: java.net.UnknownHostException 同时查看eureka的access.log 出现如下异常 10.xxx.xxx.xxx - - [27/May/2025:23:57:29 0800] “PUT /eureka/apps/{appName}/{host}:xxx-job:8082?statusUP&lastDirtyTimestamp1748351637173 H…...

Transformer实战——词嵌入技术详解

Transformer实战——词嵌入技术详解 0. 前言1. 词嵌入基础2. 分布式表示3. 静态嵌入3.1 Word2Vec3.2 GloVe 4. 使用 Gensim 构建词嵌入5. 使用 Gensim 探索嵌入空间6. 动态嵌入小结系列链接 0. 前言 在本节中&#xff0c;我们首先介绍词嵌入的概念&#xff0c;然后介绍两种实现…...

[pdf、epub]300道《软件方法》强化自测题业务建模需求分析共257页(202505更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 在本账号CSDN资源下载&#xff0c;或者访问链接&#xff1a; http://www.umlchina.com/url/quizad.html 如果需要提取码&#xff1a;umlc 文件夹中的“300道软件方法强化自测题2025…...

Vue3入门指南:从零到精通的快速上手

齐爷学vue3 一、Vue3入门 vite&#xff1a;前端构架工具&#xff0c;构建速度快于webpack。轻量快速、对TS&#xff0c;JSX&#xff0c;CSS开箱即用、按需编译。 创建Vue3工程 1.在想要创建Vue3的位置打开cmd&#xff0c;执行如下命令。 npm create vuelatest 2.功能只选择…...

前端常见错误

1. TypeError: Cannot read property xxx of undefined 错误原因&#xff1a;尝试访问一个 undefined 或 null 对象的属性 / 方法。 示例代码&#xff1a; const user { name: "John" }; console.log(user.address.street); // user.address 为 undefined 解决方…...

吴恩达MCP课程(5):mcp_chatbot_prompt_resource.py

前提条件&#xff1a; 1、吴恩达MCP课程&#xff08;5&#xff09;&#xff1a;research_server_prompt_resource.py 2、server_config_prompt_resource.json文件 {"mcpServers": {"filesystem": {"command": "npx","args"…...

关于DDOS

DDOS是一门没什么技术含量的东西&#xff0c;其本质而言是通过大量数据报文&#xff0c;发送到目标受害主机IP地址上&#xff0c;导致目标主机无法继续服务&#xff08;俗称&#xff1a;拒绝服务&#xff09; DDOS灰产人期望达成的预期目标&#xff0c;几乎都是只要把对面打到 …...

云服务器自带的防御可靠吗

最近有不少朋友问我&#xff0c;云服务器自带的防御靠不靠谱。就拿大厂的云服务器来说&#xff0c;很多都自带5G防御。但这5G防御能力&#xff0c;在如今的网络攻击环境下&#xff0c;真的有些不够看。 如今&#xff0c;网络攻击手段层出不穷&#xff0c;攻击流量更是越来越大。…...

Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;迭代法&#xff08;哨兵节点&#xff09;3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;递归法4.…...

设计模式——抽象工厂设计模式(创建型)

摘要 抽象工厂设计模式是一种创建型设计模式&#xff0c;旨在提供一个接口&#xff0c;用于创建一系列相关或依赖的对象&#xff0c;无需指定具体类。它通过抽象工厂、具体工厂、抽象产品和具体产品等组件构建&#xff0c;相比工厂方法模式&#xff0c;能创建一个产品族。该模…...

基于LocalAI与cpolar技术协同的本地化AI模型部署与远程访问方案解析

文章目录 前言1. Docker部署2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址前言 各位极客朋友们!今天要向大家推荐一套创新性的本地部署方案——LocalAI技术架构。这款开源工具包能够将普通配置的笔记本电脑转化为具备强大算力的AI工作站,轻松实现…...

Linux 云服务器部署 Flask 项目(含后台运行与 systemd 开机自启)

一、准备工作 在开始正式部署之前,请确认以下前提条件已经准备好: 你有一台运行 Linux 系统(CentOS 或 Ubuntu)的服务器; 服务器有公网 IP,本例中使用:111.229.204.102; 你拥有该服务器的管理员权限(可以使用 sudo); 打算使用 Flask 构建一个简单的 Web 接口; 服务…...

霍尔效应传感器的革新突破:铟化铟晶体与结构演进驱动汽车点火系统升级

一、半导体材料革新&#xff1a;铟化铟晶体的电压放大机制 铟化铟&#xff08;InSb&#xff09;晶体因其独特的能带结构&#xff0c;成为提升霍尔电压的关键材料。相较于传统硅基材料&#xff0c;其载流子迁移率高出3-5倍&#xff0c;在相同磁场强度下可显著放大霍尔电压。其作…...

无法运用pytorch环境、改环境路径、隔离环境

一.未建虚拟环境时 1.创建新项目后&#xff0c;直接运行是这样的。 2.设置中Virtualenv找不到pytorch环境&#xff1f;因为此时没有创建新虚拟环境。 3.选择conda环境&#xff08;全局环境&#xff09;时&#xff0c;是可以下载环境的。 运行结果如下&#xff1a; 是全局环境…...

从0开始学vue:pnpm怎么安装

一、什么是 pnpm&#xff1f; pnpm&#xff08;Performant npm&#xff09;是新一代 JavaScript 包管理器&#xff0c;优势包括&#xff1a; 节省磁盘空间&#xff1a;通过硬链接和符号链接实现高效存储安装速度更快&#xff1a;比 npm/yarn 快 2-3 倍内置工作区支持&#xf…...

React从基础入门到高级实战:React 实战项目 - 项目二:电商平台前端

React 实战项目&#xff1a;电商平台前端 欢迎来到本 React 开发教程专栏的第 27 篇&#xff01;在前 26 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件、状态、路由、性能优化和设计模式等核心知识。这一次&#xff0c;我们将通过一…...

Python 网络编程 -- WebSocket编程

作者主要是为了用python构建实时网络通信程序。 概念性的东西越简单越好理解,因此,下面我从晚上摘抄的概念 我的理解。 什么是网络通信? 更确切地说&#xff0c;网络通信是两台计算机上的两个进程之间的通信。比如&#xff0c;浏览器进程和新浪服务器上的某个Web服务进程在通…...

微信小程序动态组件加载的应用场景与实现方式

动态组件加载的应用场景与实现方式 你提供的代码展示了微信小程序中动态加载组件的方法&#xff0c;但这种方式在实际开发中需要注意使用场景和实现细节。下面我来详细说明如何应用&#xff1a; 应用场景 按需加载组件&#xff1a;在某些条件满足时才加载组件动态配置组件&a…...

人工智能在智能教育中的创新应用与未来趋势

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;教育领域正经历着一场深刻的变革。智能教育通过引入AI、物联网&#xff08;IoT&#xff09;、大数据和云计算等前沿技术&#xff0c;正在实现教育的个性化、智能化和高效化。本文将探讨人工智能在智能教育中的…...

边缘计算应用实践心得

当数据中心的光纤开始承载不了爆炸式增长的物联网数据流时&#xff0c;边缘计算就像毛细血管般渗透进现代数字肌理的末梢。这种将算力下沉到数据源头的技术范式&#xff0c;本质上是对传统云计算中心化架构的叛逆与补充——在智能制造车间里&#xff0c;实时质检算法直接在工业…...

EXCEL如何快速批量给两字姓名中间加空格

EXCEL如何快速批量给姓名中间加空格 优点&#xff1a;不会导致排版混乱 缺点&#xff1a;无法输出在原有单元格上&#xff0c;若需要保留原始数据&#xff0c;可将公式结果复制后“选择性粘贴为值” 使用场景&#xff1a;在EXCEL中想要快速批量给两字姓名中间加入空格使姓名对…...

OD 算法题 B卷【BOSS的收入】

文章目录 BOSS的收入 BOSS的收入 一个公司只有一个boss&#xff0c;其有若干一级分销&#xff0c;一级分销又有若干二级分销&#xff0c;每个分销只有唯一的上级&#xff1b;每个月&#xff0c;下级分销需要将自己的总收入&#xff08;自己的下级上交的&#xff09;&#xff0…...

Linux共享内存原理及系统调用分析

shmget 是 System V 共享内存的核心系统调用之一&#xff0c;其权限位&#xff08;shmflg 参数&#xff09;决定了共享内存段的访问控制和创建行为。以下是权限位的详细解析&#xff1a; 权限位的组成 shmflg 参数由两部分组成&#xff1a; 权限标志&#xff08;低 9 位&…...

Jenkins | Linux环境部署Jenkins与部署java项目

1. 部署jenkins 1.1 下载war包 依赖环境 jdk 11 下载地址: https://www.jenkins.io/ 依赖环境 1.2 启动服务 启动命令 需要注意使用jdk11以上的版本 直接启动 # httpPort 指定端口 #-Xms2048m -Xmx4096m 指定java 堆内存初始大小 与最大大小 /usr/java/jdk17/bin/java…...

react私有样式处理

react私有样式处理 Nav.jsx Menu.jsx vue中通过scoped来实现样式私有化。加上scoped&#xff0c;就属于当前组件的私有样式。 给视图中的元素都加了一个属性data-v-xxx&#xff0c;然后给这些样式都加上属性选择器。&#xff08;deep就是不加属性也不加属性选择器&#xff09; …...

UDP/TCP协议全解

目录 一. UDP协议 1.UDP协议概念 2.UDP数据报格式 3.UDP协议差错控制 二. TCP协议 1.TCP协议概念 2.三次握手与四次挥手 3.TCP报文段格式&#xff08;重点&#xff09; 4.流量控制 5.拥塞控制 一. UDP协议 1.UDP协议概念 当应用层的进程1要向进程2传输报文&#xff…...

nginx 服务启动失败问题记录

背景和问题 systemctl status nginx.service 查看报错信息&#xff0c;显示如下&#xff1a; nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol) nginx: configuration file /etc/nginx/nginx.conf test failed问题分析 这个错误通常…...