数据结构实验之图论六:村村通公路SDUT_3362
2017-12-03 16:16
134 查看
PS:最小生成树, Prim算法
#include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int MG[1005][1005];//邻接矩阵储存图 int dis[1005];//记录当前生成树到每个节点的距离 bool visit[1005];//标记数组 int Sum, n, m;//最小生成树的权值总和, 节点数, 边数 //最小生成树算法,普里姆算法 void Prim() { Sum = 0; int minDis;//当前生成树到每个节点的最小距离 memset(visit, false, sizeof(visit)); //从1号节点开始,记录当前生成树到每个节点的距离 for(int i=1; i<=n; i++) dis[i] = MG[1][i]; visit[1] = true; int pos;//记录每次找到的最短距离的节点 bool IsFound = true;// //一共n个节点,最小生成树有n-1条边,所以有n-1次循环 for(int i=1; i<n; i++) { minDis = INF; for(int j=1; j<=n; j++) { //从dis数组中找距离最短的 if(!visit[j] && dis[j] < minDis) { minDis = dis[j]; pos = j; } } //如果没找到,则是剩下的节点中与当前生成树没有连通,跳出循环 if(minDis == INF) { IsFound = false; break; } Sum += minDis;//权值增加 visit[pos] = true;//生成树“长大” for(int j=1; j<=n; j++) { if(!visit[j] && dis[j] > MG[pos][j]) dis[j] = MG[pos][j]; } } if(IsFound) cout<<Sum<<endl; else cout<<"-1"<<endl; } int main() { while(cin>>n>>m) { //矩阵初始化(嵌套循环) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(i == j) MG[i][j] = 0; else MG[i][j] = INF; } for(int i=0; i<m; i++) { int a, b, c; cin>>a>>b>>c; //避免边重复 if(MG[a][b] > c) MG[a][b] = MG[b][a] = c; } Prim(); } return 0; }
相关文章推荐
- 3362 数据结构实验之图论六:村村通公路
- SDUT_3362_数据结构实验之图论六:村村通公路
- (模板题)sdut 3362 数据结构实验之图论六:村村通公路(prim求最小生成树)
- sdutoj 3362 数据结构实验之图论六:村村通公路(最小生成树(裸的))
- SDUT 3362 数据结构实验之图论六:村村通公路(并查集)
- SDUT-3362 数据结构实验之图论六:村村通公路
- 3362-数据结构实验之图论六:村村通公路
- SDUT 3362-数据结构实验之图论六:村村通公路(最小生成树_prim)
- SDUT 3362 数据结构实验之图论六:村村通公路
- SDUT-3362 数据结构实验之图论六:村村通公路
- 数据结构实验之图论六:村村通公路 sdut oj (3362)
- SDUT OJ 3362 数据结构实验之图论六:村村通公路
- [SDUT](3362)数据结构实验之图论六:村村通公路 ---最小生成树(图)
- 3362-数据结构实验之图论六:村村通公路
- 数据结构实验1-日期:9月8日
- 2137 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构实验之排序七:选课名单
- 数据结构实验之链表一:顺序建立链表
- SDUTOJ(1488)数据结构实验:连通分量个数
- 数据结构实验之图论七:驴友计划(folyd算法)