最小生成树 忘是亡心i 2022-08-03 05:28 217阅读 0赞 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树在n个顶点的情形下,有n-1条边。生成树是对连通图而言的,是连同图的极小连通子图,包含图中的所有顶点,有且仅有n-1条边。非连通图的生成树则组成一个生成森林;若图中有n个顶点,m个连通分量,则生成森林中有n-m条边。 #include "stdafx.h" #include<vector> #include<algorithm> using namespace std; #define N 9 #define MIN 1000000 typedef struct{ int vexnum, arcnum; char vexs[N]; int matirx[N][N]; }graph; graph g; int mx[N][N]; // 初始化图数据 // 0---1---2---3---4---5---6---7---8--- // A---B---C---D---E---F---G---H---I--- void initiate_graph() { // A-B, A-D, A-E g.matirx[0][1] = 10; g.matirx[1][0] = 10; g.matirx[0][3] = 5; g.matirx[3][0] = 5; g.matirx[0][4] = 7; g.matirx[4][0] = 7; // B-C g.matirx[1][2] = 18; g.matirx[2][1] = 18; // C-F g.matirx[2][5] = 3; g.matirx[5][2] = 3; // D-E, D-G g.matirx[3][4] = 9; g.matirx[4][3] = 9; g.matirx[3][6] = 25; g.matirx[6][3] = 25; // E-F, E-H g.matirx[4][5] = 1; g.matirx[5][4] = 1; g.matirx[4][7] = 14; g.matirx[7][4] = 14; // F-H, F-I g.matirx[5][7] = 8; g.matirx[7][5] = 8; g.matirx[5][8] = 30; g.matirx[8][5] = 30; // G-H g.matirx[6][7] = 6; g.matirx[7][6] = 6; // H-I g.matirx[7][8] = 20; g.matirx[8][7] = 20; } bool UDless(pair<pair<int, int>,int> elem1, pair<pair<int, int>,int> elem2) { return elem1.second < elem2.second; } //广度优先遍历一遍,如果不能经过所有节点,则不是连通图 bool IsConnectedGraph() { int a[N] = { 0 }; vector<int>vec; vector<int>aa; int k = 0; vec.push_back(0); a[0] = 1; while (vec.size() != 0) { while (k < vec.size()) { int mm = 0; while (mm < N) { if (mx[vec[k]][mm]>0 && a[mm]==0) { aa.push_back(mm); a[mm] = 1; } mm++; } k++; } vec = aa; k = 0; aa.clear(); } for (int i = 0; i < N; i++) if (a[i] == 0) return false; return true; } bool is_erasable(int ii,int jj) { mx[ii][jj] = 0; mx[jj][ii] = 0; if (IsConnectedGraph()) return true; else return false; } void MST(graph g) { int sv = 0; vector<pair<pair<int, int>, int>>ve; for (int i = 0; i < N; i++) for (int j = i; j < N; j++) { if (g.matirx[i][j]) { sv++; pair<int, int > aa = make_pair(i, j); pair<pair<int, int>, int>a = make_pair(aa, g.matirx[i][j]); ve.push_back(a); } } for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) { mx[i][j] = g.matirx[i][j]; } int k = sv - N + 1; sort(ve.begin(), ve.end(),UDless); while (k > 0) { pair<pair<int, int>, int>a = ve.back(); ve.pop_back(); while (!is_erasable(a.first.first, a.first.second)) { mx[a.first.first][a.first.second] = a.second; mx[a.first.second][a.first.first] = a.second; a = ve.back(); ve.pop_back(); } k--; } } int _tmain(int argc, _TCHAR* argv[]) { initiate_graph(); MST(g); system("pause"); return 0; }
相关 最小生成树 最小生成树定义: 在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即![(u, v)\\in E][u_ v_in E]),而 末蓝、/ 2022年09月20日 15:18/ 0 赞/ 200 阅读
相关 生成树相关问题(最小生成树变形,次小生成树,最小度限度生成树,极差最小生成树) 生成树相关问题(最小生成树变形,次小生成树,最小度限度生成树,极差最小生成树) 视频:[https://www.bilibili.com/video/BV1G64y187ke Bertha 。/ 2022年09月12日 05:52/ 0 赞/ 201 阅读
相关 最小生成树 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树在n个顶点的情形下,有n-1条边。生成树是对连 忘是亡心i/ 2022年08月03日 05:28/ 0 赞/ 218 阅读
相关 最小生成树 邻接矩阵建图+prim朴素[算法][Link 1] 代码通过HDU1102 \[cpp\] [view plain][] [copy][view plain] 1. 超、凢脫俗/ 2022年06月09日 04:27/ 0 赞/ 69 阅读
相关 最小生成树 有n个城市,m条道路,现在输入n到m的道路的长度,用最少的边将图连接,输出让图连接的最小值 这道题我研究了好长时间才把答案看明白,现在给大家分享一下 具体代码如下 爱被打了一巴掌/ 2022年05月30日 08:56/ 0 赞/ 177 阅读
相关 最小生成树 设G = (V,E)是无向连通带权图,即一个网络。E中的每一条边(v,w)的权为c\[v\]\[w\]。如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成 红太狼/ 2022年05月24日 11:41/ 0 赞/ 264 阅读
相关 最小生成树 问题提出: 要在n个城市间建立通信联络网。顶点:表示城市,权:城市间通信线路的花费代价。希望此通信网花费代价最小。 问题分析: 答案只能从生成树中找,因为要做到任何 雨点打透心脏的1/2处/ 2022年03月18日 12:28/ 0 赞/ 288 阅读
相关 最小生成树 kruskal算法基本思路:先对边按权重从小到大排序,先选取权重最小的一条边,如果该边的两个节点均为不同的分量,则加入到最小生成树,否则计算下一条边,直到遍历完所有的边。 p ゝ一纸荒年。/ 2022年02月25日 14:20/ 0 赞/ 267 阅读
相关 最小生成树 最小生成树 什么是最小生成树 给定一张无向带权图G=(V,E,W),从中挑选出|V|-1条边,使得V中任意两点都有直接或者间接的路径 显然,最后得到的子 浅浅的花香味﹌/ 2021年12月22日 01:57/ 0 赞/ 321 阅读
相关 最小生成树 Jungle Roads [http://poj.org/problem?id=1251][http_poj.org_problem_id_1251] Descrip 逃离我推掉我的手/ 2021年11月29日 22:28/ 0 赞/ 420 阅读
还没有评论,来说两句吧...