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

图的拓扑序列(BFS_如果节点带着入度信息)

 way:找入度为0的节点删除,减少其他节点的入度,继续找入度为0的节点,直到删除完所有的图节点。(遍历node的neighbors就能得到neighbors的入度信息)

#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
using namespace std;//边结构的描述
class Edge
{
public://边的起始节点Node *from;//边的终点节点Node *to;//边的权重int weight;
public:Edge(Node *from, Node *to, int weight){this->from = from;this->to = to;this->weight = weight;}
};//点结构的描述
class Node
{
public://编号值int value;//入度int in;//出度int out;//邻接的点vector<Node*> nexts;//邻接的边vector<Edge*> edges;
public:Node(){}Node(int value){this->value = value;in = 0;out = 0;}
};//图结构的描述
class Graph
{
public:map<int, Node*> nodes;set<Edge*> edges;Graph(){}
};//利用边结构描述的图来构建图结构
//[0,7,5]   [from,to,weight]
//[0,1,3]   [from,to,weight]
Graph* createGraph(vector<vector<int>> matrix)
{Graph *graph = new Graph();int m = matrix.size();for(int i=0; i<m; i++){int from = matrix[i][0];int to = matrix[i][1];int weight = matrix[i][2];//将起点结构放到图里面if(!graph->nodes.count(from)){Node *fromNode =new Node(from);graph->nodes[from] = fromNode;}//将终点结构放到图里面if(!graph->nodes.count(to)){Node *toNode=new Node(to);graph->nodes[to] = toNode;}//将起点和终点的边结构也放到图里面(点可能已经存在过,边一定是新的)Node *fromNode = graph->nodes[from];Node *toNode = graph->nodes[to];Edge *newEdge = new Edge(fromNode, toNode, weight);fromNode->nexts.push_back(toNode);fromNode->edges.push_back(newEdge);fromNode->out++;toNode->in++;graph->edges.insert(newEdge);}return graph;
}vector<Node*> topSort(Graph *graph)
{//收集节点入度映射,将0入度放入que中map<Node*,int>indegreeMap;queue<Node*>zeroQue;for(auto pa:graph->nodes){indegreeMap[pa.second]=pa.second->in;if(indegreeMap[pa.second]==0){zeroQue.push(pa.second);}}vector<Node*>result;//开始按入度为0删除节点,同时减少其他节点入度,删除入度为0...while(!zeroQue.empty()){Node *cur=zeroQue.front();zeroQue.pop();result.push_back(cur);for(auto next: cur->nexts){indegreeMap[next]=indegreeMap[next]-1;if(indegreeMap[next]==0){zeroQue.push(next);}}}return result;
}

http://www.lryc.cn/news/349353.html

相关文章:

  • Linux常用指令集合
  • 前端 JS 经典:为什么需要模块化
  • MySQL:某字段追加随机数
  • 研发管理-选择研发管理系统-研发管理系统哪个好
  • 学校NTP时钟系统(时间同步系统)方案助力建设智慧校园
  • HTML中打开窗口的类型及使用方法
  • 【userfaultfd+条件竞争劫持modprobe_path】TSGCTF 2021 -- lkgit
  • StNet: Local and Global Spatial-Temporal Modeling for Action Recognition 论文阅读
  • SpringBoot解决CORS跨域——WebMvcConfigurationSupport
  • Linux之内存管理-malloc \kmalloc\vmalloc\dma
  • PyTorch中定义自己的数据集
  • 助力数字农林业发展服务香榧智慧种植,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建香榧种植场景下香榧果实检测识别系统
  • 2024 年 4 月区块链游戏研报:市场低迷中活跃用户数创新高
  • 排序(一)----冒泡排序,插入排序
  • springcloud简单了解及上手
  • Halcon与深度学习框架结合进行图像分析
  • STL----push,insert,empalce
  • 解决OpenHarmony设备开发Device Tools工具的QUICK ACCESS一直为空
  • k8s拉起一个pod底层是如何运行的
  • Java代理模式的实现详解
  • 数据结构与算法===优先队列
  • HTML常用标签-超链接标签
  • 财务管理|基于SprinBoot+vue的财务管理系统(源码+数据库+文档)
  • 快速学习SpringAi
  • 谈谈 Spring 的过滤器和拦截器
  • 请介绍下H264的多参考帧技术及其应用场景,并请说明下为什么要有多参考帧?
  • 第6章 Elasticsearch,分布式搜索引擎【仿牛客网社区论坛项目】
  • odoo 全局调整list_controller中默认方法(form_controller和kanban_controller等亦可以同样操作)
  • 大模型日报2024-05-13
  • 【使用Condition来模拟生产消费】