当前位置: 首页 > wzjs >正文

网站网络结构设计在线切图网站

网站网络结构设计,在线切图网站,网站建设要求有哪些,晋城网站制作公司怎么选通过邻接矩阵实现有向&#xff0c;无向表&#xff0c;深度遍历&#xff0c;prim算法&#xff0c;弗洛伊德算法 邻接矩阵无向图 有向图加权 邻接矩阵的深度遍历 弗洛伊德算法 邻接矩阵无向图 //邻接矩阵 #include <iostream> #include <vector> using namespac…

通过邻接矩阵实现有向,无向表,深度遍历,prim算法,弗洛伊德算法

邻接矩阵无向图

有向图加权

邻接矩阵的深度遍历

弗洛伊德算法


邻接矩阵无向图

//邻接矩阵
#include <iostream>
#include <vector>
using namespace std;class Graph{public:int vertices;       //顶点数        vector<vector<int>> adjacency_matrix;   //邻接矩阵//构造函数Graph(int vertices){this->vertices = vertices;adjacency_matrix.resize(vertices, vector<int>(vertices, 0));//vertices:表示行数//vector<int>(vertices, 0):表示每行有vertices个元素,初始化为0}//直接通过邻接矩阵添加边void add_edge(int u, int v){if(u >= 0 && u < vertices && v >= 0 && v < vertices){adjacency_matrix[u][v] = 1;adjacency_matrix[v][u] = 1;}}void print_graph(){for(int i = 0; i < vertices; i++){for(int j = 0; j < vertices; j++){cout << adjacency_matrix[i][j] << " ";}cout << endl;} }};int main(){Graph the_graph(5);the_graph.add_edge(0, 1);the_graph.add_edge(0, 2);the_graph.add_edge(1, 2);the_graph.add_edge(2, 0);the_graph.add_edge(2, 3);the_graph.add_edge(3, 3);the_graph.print_graph();return 0;
}

有向图加权

//邻接表
#include <iostream>
#include <vector>using namespace std;struct Edge{string data;int weight;Edge *next;
};struct Node{string data;Edge *first_edge;};class Graph{public:vector<Node*> nodelist;//添加节点void add_node(string data){Node *newnode = new Node;newnode->data = data;newnode->first_edge = NULL;nodelist.push_back(newnode);}int find_index(string data){for(int i=0; i<nodelist.size(); i++){if(nodelist[i]->data == data){return i;}    }cout << "没有该节点" << endl;return 0; }//添加边(有向)void add_edge(string from, string to, int weight){ Edge *newedge = new Edge;int from_index=find_index(from);int to_index=find_index(to);newedge->data = to;newedge->weight = weight;newedge->next = NULL;if(nodelist[from_index]->first_edge == NULL){nodelist[from_index]->first_edge = newedge;}else{Edge *temp = nodelist[from_index]->first_edge;while(temp->next){temp = temp->next;}temp->next = newedge;}}void print_graph(){for(int i=0; i<nodelist.size(); i++){cout<<nodelist[i]->data<<"->";Edge *temp = nodelist[i]->first_edge;while(temp){cout<<temp->data<<"(权重为: "<<temp->weight<<")";temp = temp->next;}cout<<endl;}}};int main(){Graph graph;graph.add_node("A");graph.add_node("B");graph.add_node("C");graph.add_node("D");graph.add_edge("A", "B", 1);graph.add_edge("A", "C", 2);graph.add_edge("B", "D", 3);graph.add_edge("C", "D", 4);graph.print_graph();return 0;
}

邻接矩阵的深度遍历

//邻接矩阵的深度遍历
#include <iostream>
#include <vector>using namespace std;class Graph{public:vector<vector<int>> adjacency_matrix;int vertex_num; //顶点数int edge_num;   //边数char** vertex;  //动态分配Graph(int vertex_num){this->vertex_num = vertex_num;//标记顶点是否访问过,一开始全部为0//这里使用二维数组,第一行为顶点编号,第二行为顶点是否访问过 //动态分配内存vertex =new char*[vertex_num];for(int i = 0; i < vertex_num; i++){vertex[i] = new char[2];vertex[i][1] = 0;            vertex[i][0] = 'A'+i;}adjacency_matrix.resize(vertex_num, vector<int>(vertex_num, 0));}//析构函数,释放内存~Graph() {for (int i = 0; i < vertex_num; ++i) {delete[] vertex[i];}delete[] vertex;}void add_edge(int v1, int v2){if(v1<vertex_num && v2<vertex_num&&v1>=0&&v2>=0){adjacency_matrix[v1][v2] = 1;adjacency_matrix[v2][v1] = 1;    }        }//输出节点后置位1,表示访问过void dfs(int v){if(v<vertex_num && v>=0){cout<<vertex[v][0]<<" ";vertex[v][1] = 1;for(int i = 0; i < vertex_num; i++){if(adjacency_matrix[v][i] == 1 && vertex[i][1]!=1){dfs(i);}}}}/*因为我这里所有的点都连在一起了,所以实际上只要一次遍历就可以输出所有的点也就是直接dfs(0)就可以*/void print_graph(){/*for(int i=0; i<vertex_num; i++){if(vertex[i][1]==0){dfs(i);break;}}*/dfs(0);cout<<endl;}};int main(){Graph g(8);g.add_edge(0,1);g.add_edge(0,2);g.add_edge(0,3);g.add_edge(3,4);g.add_edge(4,5);g.add_edge(5,6);g.add_edge(6,1);g.add_edge(2,7);g.add_edge(7,4);g.add_edge(6,2);g.add_edge(6,8);g.print_graph();return 0;
}

prim算法

#include <iostream>
#include <vector>
#include <climits>using namespace std;class Graph {
public:vector<vector<int>> adjacency_matrix;int vertex_num; // 顶点数char** vertex;  // 动态分配:vertex[i][0] = 'A' + i,vertex[i][1] = 是否访问过Graph(int vertex_num) {this->vertex_num = vertex_num;adjacency_matrix.resize(vertex_num, vector<int>(vertex_num, 0));// 初始化顶点数组vertex = new char*[vertex_num];for (int i = 0; i < vertex_num; i++) {vertex[i] = new char[2];vertex[i][0] = 'A' + i;vertex[i][1] = 0; // 未访问}}~Graph() {for (int i = 0; i < vertex_num; i++) {delete[] vertex[i];}delete[] vertex;}void add_edge(int v1, int v2, int weight = 1) {if (v1 >= 0 && v1 < vertex_num && v2 >= 0 && v2 < vertex_num) {adjacency_matrix[v1][v2] = weight;adjacency_matrix[v2][v1] = weight; }}//到这里其实和前面的创建邻接矩阵的代码一样//下面就是prim的实现void prim(int startVertex = 0) {vector<int> parent(vertex_num);         // 父节点数组vector<int> key(vertex_num, INT_MAX);   // 到各顶点的最小权重vector<bool> inMST(vertex_num, false); // 是否已加入 MSTkey[startVertex] = 0;parent[startVertex] = -1;// 找到当前 key 最小的未加入 MST 的顶点// 这里只是找到下一个可能顶点,并没有把新的点放到MST中,也没有把权重放到key中for (int count = 0; count < vertex_num; count++) {// 找当前 key 最小的未加入 MST 的顶点int u = -1;for (int i = 0; i < vertex_num; ++i) {if (!inMST[i] && (u == -1 || key[i] < key[u])) {u = i;}}if (u == -1) break;inMST[u] = true;cout << "加入 MST: " << vertex[u][0] << endl;/*使用 u 来更新所有未加入 MST 的邻接点对于每一个与 u 相连的顶点 v,如果 v 尚未加入 MST并且 u-v 的边权小于当前记录的 key[v],则更新 key[v] 和 parent[v]其实就是加入新u后通过这个u帮我们看看哪些点可以更近,如果 u 到某个未访问顶点 v 的路径比之前知道的更短,那就更新这个路径*/for (int v = 0; v < vertex_num; ++v) {int weight = adjacency_matrix[u][v];if (!inMST[v] && weight != 0) {if (weight < key[v]) {key[v] = weight;parent[v] = u;cout << "更新顶点 " << vertex[v][0]<< ": 新权重=" << key[v]<< ", 父节点=" << vertex[u][0] << endl;}}}cout << "-----------------------------" << endl;}// 输出 MSTcout << "最小生成树:" << endl;int totalWeight = 0;for (int i = 1; i < vertex_num; ++i) {cout << vertex[parent[i]][0] << " - " << vertex[i][0] << " : " << key[i] << endl;totalWeight += key[i];}cout << "总权重: " << totalWeight << endl;}};int main() {Graph g(8);g.add_edge(0, 1, 4);g.add_edge(0, 2, 3);g.add_edge(0, 3, 7);g.add_edge(3, 4, 2);g.add_edge(4, 5, 5);g.add_edge(5, 6, 1);g.add_edge(6, 1, 8);g.add_edge(2, 7, 6);g.add_edge(7, 4, 9);g.add_edge(6, 2, 2);g.prim(0); return 0;
}

弗洛伊德算法

//弗洛伊德算法
//这里也是无向图
#include <iostream>
#include <vector>
#include <climits>using namespace std;class Graph {
public:vector<vector<int>> adjacency_matrix;int vertex_num; // 顶点数Graph(int vertex_num) {this->vertex_num = vertex_num;adjacency_matrix.resize(vertex_num, vector<int>(vertex_num, INT_MAX));// 初始化对角线为0,其余为MAXfor (int i = 0; i < vertex_num; i++) {adjacency_matrix[i][i] = 0;}}void add_edge(int v1, int v2, int weight = 1) {if (v1 >= 0 && v1 < vertex_num && v2 >= 0 && v2 < vertex_num) {adjacency_matrix[v1][v2] = weight;adjacency_matrix[v2][v1] = weight; }}void floyd() {// 复制原始邻接矩阵作为距离矩阵,就是保存各点之间的最短距离vector<vector<int>> dist = adjacency_matrix;/*添加中间节点k这里的思路其实挺nb的,我们知道了起始节点。他从0开始循环,比如找0位和2位,他就会通过改变k来找出只经过一个节点的情况下的最小距离,然后把这个直接写道dist中,这样我们就可以直接使用0->2,不用管中间的节点,直接视为一段距离然后继续往下计算就可以不断地找到任意最短距离这里我们是定k,然后去比为了方便理解,我们可以先看k=0时的输出(调试的第一段)看到第4行第2列,这里为14,其实就是4->0+0->1的距离在我们k=2的时候因为0->1的距离缩小成3,所以4->1也变为13*/for (int k = 0; k < vertex_num; ++k) {for (int i = 0; i < vertex_num; ++i) {for (int j = 0; j < vertex_num; ++j) {if (dist[i][k] != INT_MAX && dist[k][j] != INT_MAX &&dist[i][k] + dist[k][j] < dist[i][j]){dist[i][j] = dist[i][k] + dist[k][j];}}}cout << "各顶点之间的最短路径:" << endl;for (int i = 0; i < vertex_num; ++i) {for (int j = 0; j < vertex_num; ++j) {if (dist[i][j] == INT_MAX)cout << "没有路径"<<"   ";elsecout << dist[i][j] << "   ";}cout << endl;}cout<<"----------------------------"<<endl;}
}
};int main() {Graph g(6);g.add_edge(0, 1, 4);g.add_edge(0, 4, 10);g.add_edge(1, 2, 2);g.add_edge(0, 2, 1);g.add_edge(2, 3, 2);g.add_edge(3, 4, 8);g.add_edge(5, 1, 8); g.add_edge(5, 3, 5);g.floyd();return 0;
}

http://www.dtcms.com/wzjs/543845.html

相关文章:

  • 苏州网站建设系统找哪家舆情报告撰写
  • 福州网站推广公司wordpress dealers
  • win2003服务器网站管理工具wordpress发邮件收不到
  • 南京网站开发南京乐识行在阿里云安装wordpress
  • 怎么给网站做seo整站优化外包公司
  • 网站建站后维护需要做哪些wordpress全屏首页
  • 网站开发实施计划与安排群晖系统可以做网站吗
  • 玛迪网站建设网站开发需要看相关书籍
  • 如何做电商网站首页石家庄vi设计公司
  • 仙居网站开发网站设计机构排行榜
  • 浙江大学教室办事大厅网站建设做个网站 多少钱
  • 深圳苍松大厦 网站建设厦门网站建设报价
  • 网站建设痛点广东网页制作推广
  • 艺梵科技 网站建设wordpress通知邮件美化
  • 网站关键字多少个怎么做网站链接的快捷方式
  • 潍坊路通工程建设有限公司网站php网站开发案例pdf
  • 哈尔滨门户网站建设管理咨询公司有哪些
  • 公司做网站设计要注意微信微网站开发百度云
  • 上海网站制作设计公司天津百度推广中心
  • 网站联盟是什么嘉兴网站定制
  • wordpress软件网站模板下载网页传奇手游
  • 专做腰带的网站wordpress页面上下级
  • 做网站品免费个人网站+上传
  • 和各大网站做视频的工作总结湖南 seo
  • 用照片做视频的模板下载网站好关键字挖掘
  • 帮人做微信是哪个网站WordPress分类目录图标
  • 我的网站域名是什么咸阳网站网站建设
  • 江门网站建设推广平台WordPress启用主题无反应
  • 二级域名做网站注意徐州网站建设市场分析
  • 网站设计定做建设培训网站办安全员c证