图(Dijkstra,Prim,Kruskal)
图的一些算法包括:
1 遍历算法
DFS 一条路走到底不行再回 (堆栈)
BFS 把窝边草吃完在吃外面一圈(队列实现)
2 生成树算法
Kruskal 每次总找最小边,且最小边不是在已经弄完的集合
Prim 先找一个点然后根据这个顶点每次搜索外面的顶点到已经形成集合最小边
3 最短路径
Dijkstra(俩个顶点)有边数为负数不能用得用下面那个
Floyd(多源)
#include<iostream>
#include<sstream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
#define MAX 10
#define MAXVAL 9999
class K
{
public:int i, j;int data;bool operator<(K b){return data < b.data;}
};
template<class T>
class MGraph {T vertex[MAX];//顶点int edge[MAX][MAX];//邻接矩阵int vertexNum, edgeNum;//定点数和边数
public:MGraph(T a[], int n, int e);//有向图MGraph(T a[], int n, int e,int m);void ouput();void BFS();void Prim();//生成树void Kruskal();//极小连通子图int find(int a[], int x);//并查集void DisBFS(int v);//所有顶点到v的最短路径 不带权值void Dijkstra1(int v);//最短路径 带权值void Dijkstra(int v,int x);void Floyd();//多源最短路};
template<class T>
MGraph<T>::MGraph(T a[], int n, int e)
{vertexNum = n; edgeNum = e;//dinint i, j, k, weight;for (i = 0; i < n; i++)//存储顶点vertex[i] = a[i];for (i = 0; i < MAX; i++)//初始化邻接矩阵for (j = 0; j < MAX; j++)if (i == j)edge[i][j] = 0;else edge[i][j] = MAXVAL;cout << "\n input " << edgeNum << " zu shu ju (i,j weight) \n";for (k = 1; k <= e; k++) //输入边{cin >> i >> j >> weight;//输入边的顶点,权edge[i][j] = weight;//edge[j][i] = weight;}}
template<class T>
MGraph<T>::MGraph(T a[], int n, int e,int m)
{vertexNum = n; edgeNum = e;//dinint i, j, k, weight;for (i = 0; i < n; i++)//存储顶点vertex[i] = a[i];for (i = 0; i < MAX; i++)//初始化邻接矩阵for (j = 0; j < MAX; j++)if (i == j)edge[i][j] = 0;else edge[i][j] = MAXVAL;cout << "\n input " << edgeNum << " zu shu ju (i,j weight) \n";for (k = 1; k <= e; k++) //输入边{cin >> i >> j >> weight;//输入边的顶点,权edge[i][j] = weight;edge[j][i] = weight;}}
template<class T>
void MGraph<T>::ouput()
{cout << "\t";for (int i = 0; i < vertexNum; i++){cout << vertex[i] << "\t";}cout << endl;for (int i = 0; i < vertexNum; i++){cout << vertex[i] << "\t";for (int o = 0; o < vertexNum; o++){if (edge[i][o] != MAXVAL)cout << edge[i][o] << "\t";else cout << "?\t";}cout << endl;}
}
template<class T>
void MGraph<T>::BFS()
{static bool flag[MAX] = { 0 };queue<int> q;q.push(0);flag[0] = 1;while (!q.empty()){for(int i=0;i<vertexNum;i++)if (edge[q.front()][i] != MAXVAL && edge[q.front()][i] != 0)if (!flag[i]) {q.push(i);flag[i] = 1;}cout << q.front() << " ";q.pop();}
}
template<class T>
void MGraph<T>::Prim()
{int adjvex[MAX] = { 0 }, lowcost[MAX] = { 0 };for (int i = 0; i < vertexNum; i++){lowcost[i] = edge[0][i];}for (int k = 1; k < vertexNum; k++){int min=-1;for (int j = 0; j < vertexNum; j++){if (lowcost[j] != 0 && min == -1) min = j;else if (lowcost[j] != 0 && lowcost[min] > lowcost[j]) min = j;} cout << "(" << vertex[min] << "," << vertex[adjvex[min]] << ")" << "权值是" << lowcost[min] << endl;lowcost[min] = 0;for (int j = 0; j < vertexNum; j++){if (lowcost[j] > edge[j][min]){lowcost[j] = edge[min][j];adjvex[j] = min;}}}for (int i = 0; i < vertexNum; i++)cout << i << " " <<adjvex[i] << endl;
}
template<class T>
void MGraph<T>::Kruskal()
{int a[MAX];K b[MAX * MAX];int t = 0;for (int i = 0; i < vertexNum; i++)a[i] = i;for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){if (edge[i][j] != 0 && edge[i][j] != MAXVAL){b[t].i = i;b[t].j = j;b[t].data = edge[i][j];t++;}}}sort(b, b + t);for (int i = 0; i < t; i++){int x = find(a, b[i].i);int y = find(a, b[i].j);if (x != y){cout <<vertex[ b[i].i] << ", " << vertex[b[i].j] << "权值为" << edge[b[i].i][b[i].j] << endl;a[x] = y;}else continue;//cout << b[i].i << " " << b[i].j << " " << b[i].data << endl;}}
template<class T>
int MGraph<T>::find(int a[], int x)
{if (a[x] != x) return find(a, a[x]);return x;
}
template<class T>
void MGraph<T>::DisBFS(int v)
{int dis[MAX] = { 0 };queue<int> q;q.push(v);dis[v] = 0;while (!q.empty()){for(int i=0;i<vertexNum;i++)if (edge[i][q.front()] != 0 && edge[i][q.front()] != MAXVAL&&dis[i]==0&&i!=v){q.push(i);dis[i] = dis[q.front()] + 1;cout << i << "到 " << 0 << "的最短路径" << dis[i] << endl;}q.pop();}
}
template<class T>
void MGraph<T>::Dijkstra1(int v)//自己根据广度搜索瞎写的不一定对
{int dis[MAX],flag[MAX] = { 0 };for (int i = 0; i < vertexNum; i++)dis[i] = edge[v][i];queue<int> q;q.push(v);flag[v] = 1;while (!q.empty()){for (int i = 0; i < vertexNum; i++)if (edge[i][q.front()] != 0 && edge[i][q.front()] != MAXVAL && i != v){if (!flag[i]){q.push(i);flag[i] = 1; } dis[i] =min(dis[i], dis[q.front()] + edge[q.front()][i]);}q.pop();}for (int i = 0; i < vertexNum; i++){cout << v << "到" << i << "最短路径为" << dis[i] << endl;}
}
template<class T>
void MGraph<T>::Dijkstra(int v,int x)//也不是标准的算法,弄不明白和别人不一样
{string path[MAX];int dis[MAX], k = v;for (int i = 0; i < vertexNum; i++){dis[i] = edge[v][i];path[i] = vertex[v] ;}while (k != x){ dis[k] = 0; k = v; for (int o = 0; o < vertexNum; o++)if (dis[o] != 0 && ((k == v) || (dis[o] < dis[k])))k = o;cout << v << "到" << k << "最短路径为" << dis[k] << endl;for (int o = 0; o < vertexNum; o++)if (dis[o] > dis[k] + edge[k][o]){dis[o] = dis[k] + edge[k][o];path[o] += vertex[k];} }//cout << v << "到" << x << "最短路径为" << dis[x] << endl;cout << path[x] << vertex[x] << endl;}
template<class T>
void MGraph<T>::Floyd()
{int D[MAX][MAX];for (int i = 0; i < vertexNum; i++)for (int o = 0; o < vertexNum; o++)D[i][o] = edge[i][o];for (int i = 0; i < vertexNum; i++)for (int o = 0; o < vertexNum; o++)for (int j = 0; j < vertexNum; j++)D[o][j] = min(D[o][j],D[o][i] + D[i][j]) ;for (int i = 0; i < vertexNum; i++){for (int o = 0; o < vertexNum; o++)cout<<D[i][o]<<" ";cout << endl;}
}
int main()
{int n, m;string a[10];cin >> n >> m;for (int i = 0; i < n; i++)a[i] = " V"+to_string(i);//a[i] = ('a' + i);MGraph<string> M(a, n, m,0);//M.BFS();M.ouput();/*cout << endl;M.Prim();cout << endl;M.Kruskal();*///M.DisBFS(0);M.Dijkstra(0,2);M.Dijkstra1(0);M.Floyd();return 0;
}/*6 90 1 34 0 2 46 0 5 19 2 5 25 2 3 17 3 5 25 3 4 38 5 4 26 1 4 12
*/
/*
5 7
0 1 10
0 3 30
0 4 100
1 2 50
2 4 10
2 3 20
3 4 607 10
0 4 11
0 6 7
1 2 8
3 1 10
3 5 3
4 3 7
5 4 10
5 2 9
6 1 15
6 3 6
*/
图(Dijkstra,Prim,Kruskal)相关推荐
- 最小生成树图之-Prim算法和Kruskal算法
最小生成树算法: 结合上一章学习了解了图的基本概念,接下来了解一下最小生成树的两种算法. Prim算法(普里姆算法): 思想:找到所有最短的权值连接的顶点集合,所组成的树是最小生成树. 从某一顶点为起 ...
- ReviewForJob——最小生成树(prim + kruskal)源码实现和分析
[0]README 1)本文旨在给出 ReviewForJob--最小生成树(prim + kruskal)源码实现和分析, 还会对其用到的 技术 做介绍: 2)最小生成树是对无向图而言的:一个无向图 ...
- 最小生成树算法详解(prim+kruskal)
最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里 ...
- 最小代价生成树Prim/Kruskal(c/c++)
常用的求最小代价生成树的方法有两种:Prim算法和Kruskal算法,这两种算法都是贪心算法的应用, Prim算法 在一个无向带权图中求得最小生成树得思路是:从a顶点出发,将a放入u集合(表示已选), ...
- Prim / Kruskal - 局域网 - 洛谷 P2820
Prim / Kruskal - 局域网 - 洛谷 P2820 某个局域网内有 n 台计算机和 k 条 双向 网线,计算机的编号是 1∼n.由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路 ...
- HDU 1233 还是畅通工程(最小生成树 Prim+Kruskal)
原题地址 http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:(最小生成树裸题)有N个村庄,给出村庄两两之间的距离,要求铺设公路,使得任何两个村庄间都可 ...
- 图的最小生成树-Kruskal算法
问题引入 [问题描述] 编写程序,利用带权无向图的邻接矩阵存储,实现图的最小生成树Kruskal算法. [输入形式] 输入图的顶点序列及图的边的情况.如样例所示.边的输入以输入-1,-1,-1作为结束 ...
- `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树
Contents 最小生成树 Algorithm Prim Code Kruskal Prim&KruskalPrim \& KruskalPrim&Kruskal算法的性质 ...
- 数据结构课程设计——项目2:校园导游咨询(图 Dijkstra算法寻找最短路径)
数据结构课程设计--项目2:校园导游咨询(图 Dijkstra算法寻找最短路径) 一.问题描述和项目要求 1.1 问题描述 1.2 基本要求 二.问题分析 2.1 程序功能设计分析 2.2 程序实现分 ...
- ACM模板--邻接矩阵 无向图 Prim Kruskal Dijkstra
/*** C++: Dijkstra算法获取最短路径(邻接矩阵)** @author skywang* @date 2014/04/24*/#include <iomanip> #incl ...
最新文章
- AI人才报告 | AI稳超互联网平均薪资,哪些细分领域最受追捧?
- sharepoint 2007 网站操作 显示菜单不全
- javaScript一些函数--Math()
- C/C++笔试题目大全
- Oracle 常用命令举例
- [恢]hdu 2021
- Keepalived实现双机热备
- c语言让系统蓝屏,0x000000116,教您解决电脑蓝屏代码0x000000116
- c语言加减乘除计算程序,求一个计算加减乘除的C语言程序
- 解决sqlalchemy连接mysql报错ModuleNotFoundError: No module named ‘pymysql‘
- 调用模块里的action_初级测试人员进阶必备Python编码模块,看过的都说好
- Python3中的魔术方法汇总
- 2020 全国省份数据整理
- 水箱建模最小二乘法_消防水箱的设置要求
- [bowen干货]-redis常用五种数据类型命令和场景描述
- 8021什么意思_无线网络标准IEEE802.11n是什么意思
- 洛谷OJ - P2440 - 木材加工(二分答案)
- 简化sqp唯一数据的逻辑
- 算法、逻辑、数学的关系
- Flutter问题集锦——Android Studio 4.0.1 在AVD Manger中启动模拟器报“unable to locate abd”
热门文章
- 讯搜 配置mysql_迅搜创建数据库索引
- 郭炜-C语言程序设计-程序设计与算法(一)-第五周
- linux里nohup用法,小飞博客-Linux nohup用法
- 多生成树协议(MSTP)
- nginx是什么?有什么用?
- 方案A:vpn-instance to vpn-instance(PE-CE)
- KCon 2017兵器谱招募 亮出你的安全神兵
- All about Datacenter Networking Interconnection 数据中心网络互联
- linux学习——echo -n 和echo -e 参数意义
- Continued Fraction翻译