邻接矩阵实现Dijkstra算法以及BFS与DFS算法
//============================================================================
// Name : MatrixUDG.cpp
// Author : fffff
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================ #include<iostream>
#include<cstdlib>
#include<queue>
#define maxsize 100
#define far 10000
using namespace std;
class MatrixUDG{
public:
char mVerxs[maxsize];
int mVerNum;
int mEdgeNum;
public:
int mMatrix[maxsize][maxsize];
MatrixUDG();
MatrixUDG(char vexs[],int vlen,char edge[][],int elen);
~MatrixUDG();
void print();
int getPosition(char ch);
char getChar(int place);
char readChar();
};
MatrixUDG::MatrixUDG(char vexs[],int vlen,char edge[][],int elen){
this->mVerNum = vlen;
this->mEdgeNum = elen;
for(int i=;i<mVerNum;i++)
for(int j=;j<mVerNum;j++)
mMatrix[i][j] = far;
for(int i=;i<mVerNum;i++){
mVerxs[i] = vexs[i];
}
for(int i=;i<mEdgeNum;i++){
int start = getPosition(edge[i][]);
int end = getPosition(edge[i][]);
int weight;
cout<<"input weight of ("<<edge[i][]<<","<<edge[i][]<<") : ";
cin>>weight;
mMatrix[start][end]=weight;
mMatrix[end][start]=weight;
}
};
MatrixUDG::MatrixUDG(){
cout<<"input num of verx and edge:";
cin>>mVerNum>>mEdgeNum;
cout<<"input verxs:";
for(int i=;i<mVerNum;i++){
mVerxs[i] = readChar();
}
for(int i=;i<mEdgeNum;i++){
cout<<"edge("<<i<<") : ";
char startChar = readChar();
char endChar = readChar();
int start = getPosition(startChar);
int end = getPosition(endChar);
int weight;
cout<<"input weight of ("<<startChar<<","<<endChar<<") : ";
cin>>weight;
mMatrix[start][end]=weight;
mMatrix[end][start]=weight;
}
};
MatrixUDG::~MatrixUDG(){ };
void MatrixUDG::print(){
for(int i=;i<mVerNum;i++){
for(int j=;j<mVerNum;j++){
cout<<mMatrix[i][j]<<" ";
}
cout<<endl;
}
}
int MatrixUDG::getPosition(char ch){
for(int i=;i<mVerNum;i++){
if(mVerxs[i]==ch)
return i;
}
return -;
};
char MatrixUDG::getChar(int place){
return mVerxs[place];
};
char MatrixUDG::readChar(){
char cha;
cin>>cha;
while(!((cha>='a'&&cha<='z')||(cha>='A'&&cha<='Z')))
cin>>cha;
return cha;
};
void Dijkstra(int n,int v,int *dist,int *pre,int weight[][maxsize]){
/*
* 第一步:初始化s[n],dist,pre
*/
bool s[n];
for(int i=;i<n;i++){
dist[i] = weight[v][i];
s[i] = false;
if(dist[i]==far)
pre[i] = -;
else
pre[i] = v;
}
s[v] = true;
dist[v] = ;
/*
* 第二步:寻找出dist最小的顶点加入到s中
*/
for(int i=;i<n;i++){
int temp = far;
int u = v;
for(int j=;j<n;j++){
if(!s[j]&&dist[j]<temp){
temp = dist[j];
u = j;
}
}
s[u] = true;
/*
* 第三步:更新dist
*/
for(int j=;j<n;j++){
if(!s[j]&&weight[u][j]<far){
int newdist = dist[u]+weight[u][j];
if(newdist<dist[j]){
dist[j] = newdist;
pre[j] = u;
}
}
}
} }
void printTrace(MatrixUDG*PG,int *pre,int v,int u){
int start = v;
int end = u;
char cha;
while(end!=start){
cha = PG->getChar(end);
cout<<cha<<"<--";
end = pre[end];
}
cout<<PG->getChar(start)<<endl; }
bool visited[maxsize];
void Dfsk(MatrixUDG *PG,int k){
visited[k] = true;
cout<<PG->getChar(k)<<" ";
for(int i=;i<PG->mVerNum;i++)
if(PG->mMatrix[k][i]!=far&&visited[i]==false)
Dfsk(PG,i);
}
void Dfs(MatrixUDG *PG){
for(int i=;i<PG->mVerNum;i++)
if(!visited[i])
Dfsk(PG,i);
cout<<endl;
}
void Bfs(MatrixUDG *PG){
queue<int>que;
que.push();
int place;
while(!que.empty()){
place = que.front();
que.pop();
visited[place] = true;
cout<<PG->getChar(place)<<" ";
for(int i=;i<PG->mVerNum;i++){
if(PG->mMatrix[place][i]!=far&&visited[i]==false){
que.push(i);
/*
* 开始时掉了visited[i] = true;导致出错
* 因为有可能在队列中的顶点还没有出来,在后面再一次的进入队列
* 因此必须在进入队列后将其设为已访问来防止再次进入而导致的重复访问
*/
visited[i] = true;
}
}
}
}
int main(){
char verx[] = {'A','B','C','D','E','F','G'};
char edge[][] = {
{'A','C'},
{'A','E'},
{'B','D'},
{'B','E'},
{'B','G'},
{'C','F'},
{'D','F'},
{'E','G'},
{'F','G'}
};
int vlen = sizeof(verx)/sizeof(verx[]);
int elen = sizeof(edge)/sizeof(edge[]);
MatrixUDG *PG = new MatrixUDG(verx,vlen,edge,elen);
int dist[vlen];
int pre[vlen];
int startVex =;
Dijkstra(vlen,startVex,dist,pre,PG->mMatrix);
PG->print();
printTrace(PG,pre,,);
for(int i=;i<maxsize;i++){
visited[i] = false;
}
Dfs(PG);
for(int i=;i<maxsize;i++){
visited[i] = false;
}
Bfs(PG);
return ; }
邻接矩阵实现Dijkstra算法以及BFS与DFS算法的更多相关文章
- BFS和DFS算法
昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...
- 15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法
算法分析和具体步骤解说直接写在代码注释上了 TvT 没时间了等下还要去洗衣服 就先不赘述了 有不明白的欢迎留言交流!(估计是没人看的了) 直接上代码: #include<stdio.h> ...
- 图的基本算法(BFS和DFS)
图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...
- 图算法(一)——基本图算法(BFS,DFS及其应用)(2)
2)DFS 深度优先搜索总是对最近发现的节点v的出发边进行搜索,直到该节点的所有出发边都被发现 一旦节点v的所有出发边都被发现,搜索回溯到v的前驱结点进行 实现细节:时间戳 每一个结点有一个发现时间和 ...
- 图算法(一)——基本图算法(BFS,DFS及其应用)(1)
1)BFS 广度优先搜索:给定源节点s,生成广度优先搜索树广度优先搜索树中从节点s到节点v的简单路径对应的就是s到v的最短路径(边数最少的路径)广度优先:将已发现节点与未发现节点之间的边界(灰色节点) ...
- BFS与DFS算法解析
1)前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图种所有顶点进行访问,且仅访问一次. 但是图的遍历相对树的遍历更为复杂,因为图中任意顶点都能与其他顶点相邻,所以在图的遍历中必须 ...
- BFS/DFS算法介绍与实现(转)
广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...
- 算法录 之 BFS和DFS
说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...
- 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))
sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个有向图 ...
随机推荐
- Dede后台验证码不显示解决方法详解(dedecms 5.7)
今天朋友问我他本地与服务器上安装了dedecms5.7无法显示验证码,一般这种情况很少见,一般情况就是服务器设置问题,还有临时目录的权限问题 Dede后台验证码不显示或不正常分三种情况,下面来逐一分析 ...
- asp.net 在线人数
很网站都有在线人数,这一功能无处不在.现在,我们就介绍在.NET中一个简单明了的方法来统计在线用户的多少,该方法的特点就是充分的利用了ASP.NET的特点,结合global.asax文件,用Appli ...
- linux地址空间划分
LDD讲的很明白了: Linux 是一个虚拟内存系统, 意味着用户程序见到的地址不直接对应于硬件使用的物理地址. 虚拟内存引入了一个间接层, 它允许了许多好事情. 有了虚拟内存, 系统重运行的程序可以 ...
- 在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi
摘 自: http://blog.csdn.net/fxhflower/article/details/7276820 可使用以下代码: //Create our own namespaces for ...
- javascript之for-in循环(for-in Loops)
for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”. 从技术上将,你可以使用for-in循环数组(因为JavaScript中数组也是对象),但这是不推荐的.因为如果数 ...
- Shiro使用总结
Shiro已经添加到项目中,现阶段管理两个功能: 1.身份验证:(已经能够满足现阶段需求) 2.权限管理: 权限管理,需要在界面中加一些标签,后台角色.资源的管理也需要整理好,然后在前端添加管理. 1 ...
- 关于URL大小写问题
关于URL大小写的问题,不同平台的处理不同:Mac OS X 默认的文件系统(HFS case-insensitive) 是不分大小写的,Windows 上的 NTFS 也是,而 Linux 系统常用 ...
- PDM文件编辑
需要把Oracle中的表,导出到已有的PDM文件中. 1.Oracle导出表脚本 1) 2) 3) 2.PowerDesigner导入脚本 1) 2) 3) 4)
- activiti搭建(五)BPMN介绍
转载请注明源地址:http://www.cnblogs.com/lighten/p/5931207.html 对于BPMN我也不是十分清楚,目前也只是因为对于Modeler中不熟悉的组件查询,来对这部 ...
- jLink V8调试exynos 4412 u-boot的几点补充
/** ****************************************************************************** * @author Maox ...