算法之路(一)
来源:互联网 发布:招聘程序员 编辑:程序博客网 时间:2024/06/10 21:57
写在前面:
好久没有复习算法这部分的知识了,以前也养成了不好的习惯,眼高手低,理解了算法的原理,不怎么去写伪代码,也很少真的去编译一下代码。以后要改正这个不好的习惯。从今天开始,把以前学习过的算法编译一遍,当做复习。
注:我编译代码的环境有两种:1、ubuntu14.04, g++4.8.4
2、VS2015
代码基本上都是用C++写的,顺便改进下C++的编程习惯。有诸多不足,j敬请原谅,欢迎留言指正,大家共同进步。谢谢~
第一遍就从图搜索开始吧,DFS的递归实现,下一篇我将写DFS的非递归实现。
DFS的原理网上太多了,我就不去介绍了,相信都懂,直接上代码:
//Graph.h
#include <list>
using namespace std;
class Graph
{
int count;
list<int>* adj;
void DFSUtil(int v, bool visited[]);
public:
void addEdge(int v, int w);
void DFS(int v);
Graph(int count);
};
// Graph.cpp
#include <iostream>
#include <list>
#include <stdlib.h>
#include "Graph.h"
#pragma GCC diagnostic error "-std=c++11"
using namespace std;
Graph::Graph(int count)
{
this->count = count;
adj = new list<int>[count];
}
void Graph::addEdge(int v, int w)
{
adj[v].push_back(w);
}
void Graph::DFSUtil(int v, bool visited[])
{
visited[v] = true;
cout << v << " ";
for (int w:adj[v])
{
if (!visited[w])
DFSUtil(w, visited);
}
}
void Graph::DFS(int v)
{
bool *visited = new bool[count];
for (int i = 0; i < count; ++i)
visited[i] = false;
DFSUtil(v, visited);
}
// main.cpp 测试代码
#include <iostream>
#include "Graph.h"
using namespace std;
int main()
{
Graph g(8);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 0);
g.addEdge(1, 3);
g.addEdge(1, 4);
g.addEdge(2, 0);
g.addEdge(2, 5);
g.addEdge(2, 6);
g.addEdge(3, 1);
g.addEdge(3, 7);
g.addEdge(4, 1);
g.addEdge(4, 7);
g.addEdge(5, 2);
g.addEdge(5, 7);
g.addEdge(6, 2);
g.addEdge(6, 7);
g.addEdge(7, 3);
g.addEdge(7, 4);
g.addEdge(7, 5);
g.addEdge(7, 6);
cout << "DFS from 2 : " << endl;
g.DFS(0);
cout << endl;
return 0;
}
下面是运行过程和运行结果(我就直接截图了~):
俗话说,孰能生巧,要想好好掌握一个算法,熟练度必不可少。参加ACM的每个人都把这些基础代码敲上个几十遍,把屏幕关了还能敲出来,运行成功。哈哈~ 我也要多去练习练习啊~
- 算法之路(一)
- 算法之排序(一)
- 算法之图搜索算法(一)
- 每周一算法(之递归算法)
- 算法之 排序算法 (一) Java
- 算法之 查找算法 (一) Java
- Job Hunting 之路——算法题(一)
- 学习python之路---python小算法总结(一)
- ANN学习-算法篇--菜鸟之路(一)
- 算法之路(一)----求最大子序列
- A*算法之旅之初识A*算法(一)
- 算法(一)之洗牌算法
- 算法一--三塔换位移形之路
- 算法之左旋转字符串(一)
- 经典排序算法之实现(一)
- TLD算法学习之引言(一)
- Mahout之bayes算法学习(一)
- 算法篇之排序(一)
- VS2013配置Winpcap开发环境
- 生成排列
- 华为oj初级 统计大写字母个数
- mysql存emoji表情报错处理
- Leetcode040--是否是平衡二叉树
- 算法之路(一)
- 测试各种类型所占内存的大小
- android 学习中实用(一)
- (M)SIM卡开机流程分析之SubscriptionController类分析
- 进程调度方式
- 在[Linux]下 PHP程序员如何玩转Linux系列-lnmp环境的搭建
- JavaWeb学习----JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
- 在测试中mock的作用
- 什么是小程序