C++的面向对象的Dijkstra写法

  • 面向对象特点的充分使用
  • 清晰的逻辑
  • 简洁的图输入
  • 程序

面向对象特点的充分使用

清晰明确的类实现

class Edge(边的实现)

class Req (路由请求的实现)

class Graph (图的实现)

其中将Dijkstra算法放置在Graph里,方便调用

这里的邻接矩阵将会存放真正的边信息,而不再仅仅存放边的权值

Req信息包含src, dst, flow, 其中flow是流的大小

Edge信息包含src,dst,weight,capacity

清晰的逻辑

在Dijkstra算法实现的时候将Update操作和FindMin操作分别提出来当做独立的函数,这将使得Dijkstra算法函数的思路很清晰

简洁的图输入

在图的构造函数处,使用文件操作,来读入图,然后将边的信息存入如下三个vector类型的数据结构里,使用起来会非常方便:

    vector<Edge*> incL;//所有的边
vector<vector<Edge*> > adjL;//正向邻接表
vector<vector<Edge*> > adjRL;//反向邻接表

程序

程序由三部分构成:

common.h 程序用到的所有库的头文件和常量声明

resources.h 三个类的定义

main.cpp 主程序

graph.txt 图

common.h

#define COMMON_H

#include<iostream>
#include<vector>
#include<math.h>
#include<list>
#include<set>
#include<stdio.h>
#include<fstream>
using namespace std; #define MAXNODE 100;
#define INF 999999;
#endif

resources.h

#ifndef RESOURCES_H
#define RESOURCES_H #include"common.h" class Edge{
public:
int id, src, dst, weight, capacity;
Edge(int a, int b, int c, int d, int e){
id = a; src = b; dst = c; weight = d; capacity = e;
}
}; class Req{
public:
int src, dst, flow;
Req(int a, int b, int c){
src = a; dst = b; flow = c;
}
}; class Graph{
public:
int n, m;
set<int> S, V;
vector<int> d, p;
vector<Edge*> incL;
vector<vector<Edge*> > adjL;
vector<vector<Edge*> > adjRL;
Graph(string s){
ifstream infile(s);
infile >> n >> m;
int temp;
temp = m;
m = m * 2;
adjL.resize(n);
adjRL.resize(n);
d.resize(n);
p.resize(n);
int a, b, c, d;
for (int i = 0; i < temp;i++){ infile >> a >> b >> c >> d;
Edge* e1 = new Edge(i * 2, a, b, c, d);
Edge* e2 = new Edge(i * 2 + 1, b, a, c, d); incL.push_back(e1); incL.push_back(e2);
adjL[a].push_back(e1); adjL[b].push_back(e2);
adjRL[b].push_back(e1); adjRL[a].push_back(e2);
}
} void Update(int s){
for (int i = 0; i < adjL[s].size();i++)
if (d[s] + adjL[s][i]->weight < d[adjL[s][i]->dst]){
d[adjL[s][i]->dst] = d[s] + adjL[s][i]->weight;
p[adjL[s][i]->dst] = s;
}
} int FindMin(){
set<int>::iterator it, iend;
iend = S.end();
int mine = INF;
int min_node = -1;
for (it = S.begin(); it != iend; it++){
if(d[*it] < mine) {
mine = d[*it];
min_node = *it;
}
}
return min_node;
} void dijkstra(int src, int dst){
S.clear();
V.clear();
for (int i = 0; i < n; i++)
{
S.insert(i);
d[i] = INF;
p[i] = -2;
}
d[src] = 0; p[src] = -1;
Update(src);
S.erase(src);
V.insert(src);
while (S.size() != 0)
{
int mind;
mind = FindMin();
if (mind == dst) break;
Update(mind);
S.erase(mind);
V.insert(mind);
}
cout << "from node " << src << " to node " << dst << ": " << d[dst]<<endl;
}
}; #endif

main.cpp

#include"common.h"
#include"resources.h" int main()
{
Graph g("graph.txt"); g.dijkstra(1, 16); cout << "happy" << endl; getchar();
return 0;
}

graph.txt

18 21
1 17 1 10
1 2 1 20
2 17 1 20
1 3 1 30
3 4 1 30
4 17 1 30
1 5 1 40
5 6 1 40
6 7 1 40
7 17 1 40
1 8 1 50
8 9 1 50
9 10 1 50
10 11 1 50
11 17 1 50
1 12 1 100
12 13 1 100
13 14 1 100
14 15 1 100
15 16 1 100
16 17 1 100

C++的面向对象的Dijkstra写法的更多相关文章

  1. javascript面向对象的常见写法与优缺点

    我们通过表单验证的功能,来逐步演进面向对象的方式.   对于刚刚接触javascript的朋友来说,如果要写一个验证用户名,密码,邮箱的功能, 一般可能会这么写: //表单验证 var checkUs ...

  2. JS面向对象5中写法

    //定义Circle类,拥有成员变量r,常量PI和计算面积的成员函数area() //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14 ...

  3. javascript面向对象的一些写法

    因为有闭包,能返回函数,所以针对于面向对象的封装,继承,多态三个特性实现,很舒服. 代码如下: <!DOCTYPE html> <html> <head> < ...

  4. PHP面向对象的基本写法(区别于java)

    <?php /** * 这是一个人的对象 */ class ClassName { public $name; public $age; public $sex; public static $ ...

  5. JavaScript面向对象,及面向对象的特点,和如何构造函数

    1.面向对象和面向过程的区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了: 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是 ...

  6. 前端js面向对象编程以及封装组件的思想

    demo-richbase 用来演示怎么使用richbase来制作组件的例子 作为一名前端工程师,写组件的能力至关重要.虽然javascript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力 ...

  7. 关于前端js面向对象编程以及封装组件的思想

    demo-richbase 用来演示怎么使用richbase来制作组件的例子 作为一名前端工程师,写组件的能力至关重要.虽然javascript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力 ...

  8. 石川es6课程---9、面向对象-基础

    石川es6课程---9.面向对象-基础 一.总结 一句话总结: js老版本的面向对象和继承都不是很方便,新版的面向对象向其它语言靠拢,有了class,extends,constructor等关键字,用 ...

  9. Java 对象的封装,继承,抽象,接口写法

    面向对象的封装写法        关键字 private class A    {        private int a=1;        private void work()         ...

随机推荐

  1. 最新版Navicate破解激活

    2019年5月5日激活成功 版本12.1.18 Navicat12.1下载地址 http://www.navicat.com.cn/download/navicat-premium有32位和64位,大 ...

  2. 发现一个对列排版挺好用的命令:column

    help [root@hdpool1 tmp]# column -h Usage: column [options] [file ...] Options: -c, --columns <wid ...

  3. html流程实现

    https://blog.csdn.net/github_39335046/article/details/73930886 https://www.cnblogs.com/xcj26/p/98707 ...

  4. mysql数据库的多实例与主从同步。

    1.MySQL的多实例: 多实例的特点:能够有效地利用服务器的资源,节约服务器的资源 MySQL多实例的配置有两种,第一是使用一个配置文件,这种方法不推荐使用,容易出错:第二种是用多个配置文件,这种方 ...

  5. 【nodejs代理服务器四】代理服务器增加频繁访问的ip加入黑名单

    问题 渗透者在扫站的时候会频繁请求,我们可以做一些策略来封堵这些频繁访问的ip,把ip加入黑名单. 策略 2秒之内访问次数超过100,加入黑名单. 实现思路 初次访问把访问Ip作为键,访问ip,时间, ...

  6. VMware网络配置三种网络模式(桥接、NAT、Host-only)

    VMware网络配置三种网络模式(桥接.NAT.Host-only) 一.虚拟安装后三种网络模式显示 当安装好后,的“虚拟网络编辑器”中也存在三种模式,分别对应:桥接-VMnet0.Host-only ...

  7. Python基础——__name__变量

    转自:https://blog.csdn.net/u011511601/article/details/53504355 Python使用缩进对齐组织代码的执行,所有没有缩进的代码,都会在载入时自动执 ...

  8. 有关Error during sbt execution: No Scala version specified or detected的解决方案--SBT

    sbt 全称为 Simple Build Tool,是 Scala 项目中的标准构建工具,类似于 Java 下的 Maven/Groovy 中的 Gradle. 项目的构建 项目依赖自动化管理 提供统 ...

  9. xlsxwriter写入Excel文件

    #coding=utf-8 import xlsxwriter #加载包 myWorkbook = xlsxwriter.Workbook(opath+'/'+file_name+'.xlsx') # ...

  10. Windows——系统盘重置密码

    一.制作好系统启动U盘 软碟通自己制作即可 二.这进入到安装前界面按Shift+F10调出命令提示符 三.输入regedit后按回车进入注册表编辑器 四. 左键单击选中HKEY_LOCAL_MACHI ...