图简记。。

模仿: 

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 {};}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/83659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 常用命令与 Shell 简介

文章目录 **Linux 常用命令与 Shell 简介****Shell 简介****什么是 Shell&#xff1f;****Shell 的工作原理****常见 Shell 类型****命令行基础****Tab 补全与通配符** **Linux 常用命令****1. 入门必备命令****1.1 寻求帮助 - man 命令****1.2 用户间切换 - su 命令****1.3 特…

基于51单片机的超声波智能避障小车仿真

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;超声波实时测量小车与障碍物间的距离&#xff0c;并用LCD1602显示。 &#xff08;2&#xff09;当测得的距离超过50时&#xff0c;前进电机转动&#xff08;模拟后轮&#…

AIGC工具平台-GPT-SoVITS-v4-TTS音频推理克隆

声音克隆与语音合成的结合&#xff0c;是近年来生成式AI在多模态方向上的重要落地场景之一。随着预训练模型能力的增强&#xff0c;结合语音识别、音素映射与TTS合成的端到端系统成为初学者可以上手实践的全流程方案。 围绕 GPT-SoVITS-v4-TTS 模块&#xff0c;介绍了其在整合…

Android7 Input(十)View 处理Input事件pipeline

概述: 本文主要描述View对InputEvent事件pipeline处理过程。 本文涉及的源码路径 frameworks/base/core/java/android/view/ViewRootImpl.java InputEvent事件处理 View处理input事件是调用doProcessInputEvents方法&#xff0c;如下所示: void doProcessInputEvents() {//…

Neo4j 完全指南:从入门到精通

第1章&#xff1a;Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…

网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件

目录 网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件网心云 OEC/OECT 笔记(2) 运行RKNN程序 外观 内部 PCB正面 PCB背面 PCB背面 RK3566 1Gbps PHY 配置 OEC 和 OECT(OEC-turbo) 都是基于瑞芯微 RK3566/RK3568 的网络盒子, 没有HDMI输入输出. 硬件上 OEC 和 OECT…

摄像机ISP处理流程

1.Bayer&#xff1a;生成raw图&#xff0c;添加色彩数据&#xff08;RGB&#xff09;&#xff0c;一般会将G的占比设置为R和B的和&#xff0c;实例&#xff1a; 2.黑电平矫正&#xff1a;减去暗电流造成的误差&#xff1b; 3.镜头矫正&#xff1a;对四周的亮度进行矫正&#x…

【后端架构师的发展路线】

后端架构师的发展路线是从基础开发到技术领导的系统性进阶过程&#xff0c;需融合技术深度、架构思维和业务洞察力。以下是基于行业实践的职业发展路径和关键能力模型&#xff1a; 一、职业发展阶梯‌ 初级工程师&#xff08;1-3年&#xff09;‌ 核心能力‌&#xff1a;掌…

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili

RabbitMQ如何保证消息可靠性

RabbitMQ是一个流行的开源消息代理&#xff0c;它提供了可靠的消息传递机制&#xff0c;广泛应用于分布式系统和微服务架构中。在现代应用中&#xff0c;确保消息的可靠性至关重要&#xff0c;以防止消息丢失和重复处理。本文将详细探讨RabbitMQ如何通过多种机制保证消息的可靠…

批量图片管理软件介绍

软件介绍 本文介绍一款功能全面的图片处理软件 - FastStone Image Viewer。 软件功能概述 FastStone Image Viewer不仅支持图片查看&#xff0c;还具备编辑、批量重命名和批量转换等多种实用功能。 用户授权说明 该软件对个人用户完全免费&#xff0c;企业用户只需输入用户…

Playwright 测试框架 - Java

🚀【Playwright + Java 实战教程】从零到一掌握自动化测试利器! 🔧 本文专为 Java 开发者量身打造,通过详尽示例带你快速掌握 Playwright 自动化测试。涵盖基础操作、表单交互、测试框架集成、高阶功能及常见实战技巧,适用于企业 UI 测试与 CI/CD 场景。 🛠️ 一、环境…

nvidia系列教程-Usb otg模式修改为host模式

目录 前言 一、了解 USB OTG 模式与 Host 模式 二、host模式切换 总结 前言 在 NVIDIA 设备的使用过程中,有时我们需要将 USB OTG(On-The-Go)模式切换为 Host 模式,以满足连接外部设备(如 U 盘、鼠标、键盘等)的需求。本文将详细介绍如何在 NVIDIA 设备上进行这一模式…

二叉树-104.二叉树的最大深度-力扣(LeetCode)

一、题目解析 这里需要注意根节点的深度是1&#xff0c;也就是说计算深度的是从1开始计算的 二、算法原理 解法1&#xff1a;广度搜索&#xff0c;使用队列 解法2&#xff1a;深度搜索&#xff0c;使用递归 当计算出左子树的深度l&#xff0c;与右子树的深度r时&#xff0c;…

Calendar类日期设置进位问题

背景 报表需求&#xff0c;需要传递每组数据中最小的日期&#xff0c;后台根据传递的最小日期&#xff0c;向前取参数传递的月份的上个月为结束时间的近五个月数据 例&#xff1a;参数传:2025/02&#xff0c;则需返回2025/01, 2024/12, 2024/11, 2024/10, 2024/09这五个年月数据…

编程笔记---问题小计

编程笔记 qml ProgressBar 为什么valuemodel.progress / 100 在QML中&#xff0c;ProgressBar的value属性用于表示进度条的当前进度值&#xff0c;其范围通常为0到1&#xff08;或0%到100%&#xff09;。当使用model.progress / 100来设置value时&#xff0c;这样做的原因是为…

【STL】函数对象+常用算法

文章目录 STL- 函数对象函数对象函数对象使用 谓词一元谓词二元谓词内建函数对象算术仿函数关系仿函数 STL- 常用算法常用遍历算法for_eachtransform 常用查找算法findfind_ifadjacent_findbinary_searchcountcount_if 常用排序算法sortrandom_shufflemergereverse 常用拷贝和替…

[JVM] JVM内存调优

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Spring Boot 从Socket 到Netty网络编程(下):Netty基本开发与改进【心跳、粘包与拆包、闲置连接】

上一篇&#xff1a;《Spring Boot 从Socket 到Netty网络编程&#xff08;上&#xff09;&#xff1a;SOCKET 基本开发&#xff08;BIO&#xff09;与改进(NIO)》 前言 前文中我们简单介绍了基于Socket的BIO&#xff08;阻塞式&#xff09;与NIO&#xff08;非阻塞式&#xff0…

python编写赛博朋克风格天气查询程序

工具介绍 这个天气查询工具是一个基于 Python 的桌面应用程序,使用了tkinter库来创建图形用户界面(GUI),并通过requests库调用 Open - Meteo API 获取天气数据。它具有赛博朋克风格的界面设计,提供了当前天气信息、15 天天气预报以及详细的天气数据展示,同时还包含温度趋…