【基础】图论基础 2017/04/20

用临接链表表示一张图, 可以给图加边, 可以bfs

 1 #include <iostream>
 2 #include <list>
 3 #include <vector>
 4 #include <queue>
 5
 6 using namespace std;
 7
 8 void createGraph(const int& N) {
 9     return;
10 }
11
12 void addEdge(const int fromNode, const int endNode, vector<list<int>>& graph) {
13     graph[fromNode].push_back(endNode);
14 }
15
16
17 void bfs(vector<list<int>>& graph, int start) {
18     const int N = graph.size();
19     vector<int> ans;
20     queue<int> q;
21     vector<bool> visit(N, false);
22     q.push(start);
23     visit[start] = true;
24     while(!q.empty()) {
25         int cur = q.front();
26         q.pop();
27         ans.push_back(cur);
28         for (auto iter = graph[cur].begin(); iter != graph[cur].end(); ++iter) {
29             if (!visit[*iter]) {
30                 q.push(*iter);
31                 visit[*iter] = true;
32             }
33         }
34     }
35     for (auto ele : ans) {
36         cout << ele << " ";
37     }
38 }
39
40 void print_graph(vector<list<int>>& graph) {
41     const int N = graph.size();
42     for (auto i = 0; i < N; ++i) {
43         const int M = graph[i].size();
44         int j = 0;
45         for (auto iter = graph[i].begin(); iter != graph[i].end(); ++iter, ++j) {
46             cout << *iter ;
47             if (j == M - 1) {
48                 cout << endl;
49             } else {
50                 cout << " -> ";
51             }
52         }
53     }
54     return;
55 }
56
57
58 int main() {
59
60     const int N = 4;
61     vector<list<int>> graph(N, list<int>());
62     for (auto i = 0; i < N; ++i) {
63         graph[i].push_back(i);
64     }
65     addEdge(0, 1, graph);
66     addEdge(0, 2, graph);
67     addEdge(1, 2, graph);
68     addEdge(2, 0, graph);
69     addEdge(2, 3, graph);
70     addEdge(3, 3, graph);
71
72     print_graph(graph);
73
74     bfs(graph, 1);
75
76     return 0;
77 }

时间: 2024-10-11 21:48:02

【基础】图论基础 2017/04/20的相关文章

2017/04/20学习笔记

man man 查看帮助文档echo $PATHreboot 重启poweroff 关机 vim --vimvim是从vi发展过来的一款文本编辑器vim的三种工作模式命令模式--打开vim之后,默认模式编辑模式--需要输液一些命令,切换到编辑模式末行模式--在末行模式下可以输入一些命令 :号 aiosAIOS w保存光标移动HJKL行首:0行尾:$文件开始:gg结束:G行跳转: 300G x:删除光标所在字符u: 撤销X:删除光标前字符dw:删除单词d0:删除光标前d$:删除光标后 Ddd:删除

2017.04.13-2017.07.17

QQ:577007217 今日更新: 2017.07.17 Geomagic Freeform 2017.0.93 Win64 1DVD Geomagic Freeform Plus 2017.0.93 Win64 1DVD Geomagic Sculpt 2017.0.93 Win64 1DVD InnovMetric.PolyWorks.2017.IR3.Win32_64 2DVD Mentor Graphics FloTHERM XT 3.1 Win64 1DVD PolyBoard Pr

基础图论总结

在此之前需要先学会基本数据结构,递归以及搜索.回溯 用了半个月的时间终于搞完了全部的基础图论...仅介绍到差分约束 图的定义自己百度= =这里直接开始说图的存储. 图的存储有N种写法,我所知道的有邻接矩阵.边表.邻接表.前向星.边集数组.十字链表.邻接多重表,这里只讨论较容易实现的3种也是最为普遍的3种:邻接矩阵,边表和邻接表. 先说说邻接矩阵吧. 邻接矩阵是一种图的直接的储存方式,对于稠密图来说,邻接矩阵的效率要高于邻接表以及边表,但是如其名,我们需要一个n*n的二维数组,所以其空间复杂度是很

基础图论算法导引

ACM中常用图论算法 1. 拓扑排序 -> 拓扑排序的原理及其实现 2. 最短路径算法 -> 最短路算法总结 差分约束系统 -> 差分约束 前k短路 -> 前K短路径问题 3. 最小生成树问题扩展 -> 最?小?生?成?树?问?题?的?拓?展  最优比率生成树 -> 最优比率生成树 最小k度限制生成树 -> IOI2004国家集训队论文,由汪汀所著(网盘内有) 或者刘汝佳的黑书内有 裸题 poj1639 题解 4. 二分图匹配 -> 二分图的最大匹配.完美匹

python基础教程_学习笔记20:标准库:一些最爱——os

标准库:一些最爱 os os模块为你提供了访问多个操作系统服务的功能. os和它的子模块os.path还包括一些用于检查.构造.删除目录和文件的函数,以及一些处理路径的函数. os模块中一些重要函数和变量 函数/变量 描述 environ 对环境变量进行映射 system(command) 在子shell中执行操作系统命令 sep 路径中的分隔符 pathsep 分隔路径的分隔符 linesep 行分隔符('\n','\r','\r\n') urandom(n) 返回n字节的加密强随机数据 os

数据结构:图论基础

图概述 图(Graph)是一种比线性结构和树形结构都要复杂的数据结构.简单讲,图是由表示数据元素的的集合V和表示数据之间关系的集合E组成.其中,数据元素常称作顶点(vertex),数据之间的关系常称作边(edge).故图可记为G=<V,E>,其中V是顶点的有穷非空集合,E是边的集合.在图中顶点的前驱和后继是不设限制的,因此图描述的是一种网状关系. 无向图 若边是无序的或者说是无向的,则称此图是无向图.若无向图中有边(v1,v2)(无向图中边用圆括号表示),则显然(v2,v1)和(v1,v2)是

图论基础知识总结

图论基础知识总结 前言 因为博主太菜,好多之前学过的图论算法都要不记得了,于是开了这篇博文提醒自己要记得复习图论. 代码 #include<bits/stdc++.h> using namespace std; #define gc() getchar() inline int In(){ char c=gc(); int x=0,ft=1; for(;c<'0'||c>'9';c=gc()) if(c=='-') ft=-1; for(;c>='0'&&c&

js基础--javascript基础概念之语句(二)

js基础--javascript基础概念之语句(二)label,break,continue.. break .  continue 语句. break  continue 语句用于在循环中精确控制代码的执行,其中break语句会立即退出循环,执行循环后面的语句. continue 则退出循环后返回到再次进入循环中. 如: var num = 0; for(var i = 0; i<=100; i++){ if(i >= 10){ break; } num = i; } alert(num);

js基础--javascript基础概念之变量与作用域

js基础--javascript基础概念之变量.作用域 javascript按照ECMA-262 的定义,变量与其他语言变量有所不同.js变量时松散的,不需要事先定义变量类型的.这使得他只是一个保存特定值的一个名称.变量与其数据类型可以在脚本的生命周期内改变. 还有明白几点: JavaScript的变量作用域是基于其特有的作用域链的,JavaScript没有块级作用域. 基本类型和引用类型的值 ECMAScript 的变量有两种不同的数据类型:分别是 基本数据类型值 和 引用类型值 : 基本数据