算法基础 - 最小生成树(Prim算法)
来源:互联网 发布:充电数据监控 编辑:程序博客网 时间:2024/06/07 10:46
最小生成树
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边
Prim算法
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。
流程表格
如何求最短路径
- 输入一个图
- 维护一个lowcost[v]的数组,是当前已知节点到其他所有节点的最短距离。
- 每次从lowcost中找到最短的(不能添加已经添加过的节点),然后添加到已知节点里,然后更新lowcost
- 重复直到所有节点都已知。
Prim代码实现
//// main.cpp// HiHocoder//// Created by Alps on 16/5/9.// Copyright © 2016年 chen. All rights reserved.//#include <iostream>#include <cstring>#include <string>#include <vector>using namespace std;int graph[1002][1002]; //节点最大1001个int lowcost[1002];int flag[1002] = {0};int findMin(int T){ int mnLen = -1, mnNode = -1; for(int i = 0; i < T; i++){ if(flag[i] == 0 && (mnLen == -1 || mnLen > lowcost[i])){ mnLen = lowcost[i]; mnNode = i; } } if (mnNode == -1) { return -1; } for(int i = 0; i < T; i++){ lowcost[i] = min(lowcost[i], graph[mnNode][i]); } flag[mnNode] = -1; return mnLen;}long Prim(int graph[][1002], int T, int start){ flag[start] = -1; for(int i = 0; i < T; i++){ lowcost[i] = graph[start][i]; } long ans = 0; while(1){ int mn = findMin(T); if(mn == -1) break; ans += mn; } return ans;}int main(){ int T; cin>>T; for(int i = 0; i < T; i++){ for(int j = 0; j < T; j++){ cin>>graph[i][j]; } } long len = Prim(graph, T, 0); cout<<len<<endl; return 0;}
测试数据
50 1005 6963 392 1182 1005 0 1599 4213 1451 6963 1599 0 9780 2789 392 4213 9780 0 5236 1182 1451 2789 5236 0 输出:4178
0 0
- 算法基础 - 最小生成树(Prim算法)
- Prim最小生成树算法
- 最小生成树Prim算法
- 最小生成树Prim算法
- 最小生成树----Prim算法
- 最小生成树Prim算法
- Prim 最小生成树算法
- 最小生成树:Prim算法
- Prim算法 ----最小生成树
- 最小生成树-prim 算法
- 最小生成树(prim算法)
- 最小生成树 prim算法
- 最小生成树 prim算法
- Prim最小生成树算法
- 最小生成树prim算法
- 最小生成树--prim算法
- 最小生成树Prim算法
- 最小生成树(Prim算法)
- Java图形用户界面
- mysql SQL优化
- 单链表求交集
- opencv的使用例子
- 基于DHT网络的最强BT资源搜索引擎engiy.com
- 算法基础 - 最小生成树(Prim算法)
- MySQL数据库性能优化之存储引擎选择
- java基础之反射,泛型以及注解
- tomcat环境下服务器文件句柄耗尽(Too Many Open Files)的问题排查
- Html中 visibility:hidden 与 display:none 的区别
- unix学习---unix系统常用命令集锦
- DirectCompute tutorial for Unity: Kernels and thread groups
- c# XML和实体类之间相互转换(序列化和反序列化)
- Handler