最小生成树之prim算法
来源:互联网 发布:sql查询每小时 编辑:程序博客网 时间:2024/06/15 13:15
很简单的一题最小生成树的题目
农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。
prim 算法
就是从一个点开始衍生,找与此点相连的最短的边,采用那条边,获得另一个点。之后再以这两个点为基础,找与这两点相连的最短的边……直到所有点都连在一起。这个方法需要每次把边排序,很耗时,用堆排能大量缩短时间。学了c++后,可以使用优先队列,非常方便。
#include<iostream>#include<queue>using namespace std;class list{public: int value;//记录边值 int x;//记录于之相连的点 bool friend operator < ( const list &a,const list &b){ return (a.value>b.value);}//由于要的是最小边,所把优先队列修改下,把小的放前面};const int MAXN=112;priority_queue<list> Q;list temp;int n,sum;int a[MAXN][MAXN],p[MAXN];//p数组用于记录点是否以及加入void push(int x){ p[x]=1; for (int i=1;i<=n;i++) if (p[i]==0) { temp.value=a[x][i]; temp.x=i; Q.push(temp); }}void prim(){ int num;记录已经加入了几个点了 push(1);//随便加入一个点0.0
num=1;
while (num!=n) { do{ temp=Q.top(); Q.pop(); }while(p[temp.x]==1);//找到一个还没进入的点 sum+=temp.value; push(temp.x);//将此点加入 num++; }}int main(){ int i,j; cin>>n; for (i=1;i<=n;i++) for (j=1;j<=n;j++) cin>>a[i][j]; prim(); cout<<sum<<endl;}
如有不足之处,希望大家指出。
0 0
- 最小生成树算法之Prim算法
- 最小生成树算法之Prim算法
- 最小生成树算法之prim算法
- 最小生成树之Prim算法
- 最小生成树算法之prim
- 最小生成树之prim算法
- 【算法】最小生成树之prim
- 最小生成树之prim算法
- 最小生成树算法之Prim
- 最小生成树之prim算法
- 最小生成树之prim算法
- 最小生成树之prim算法
- 最小生成树之prim算法
- 最小生成树之prim算法
- 最小生成树之prim算法
- 最小生成树之Prim算法
- 最小生成树之prim算法
- 最小生成树之Prim算法
- JPA EntityManager详解
- Http长连接200万尝试及调优
- 做动态规划题的步骤和例子(还在完善中)
- Python version 2.7 required, which was not found in the registry
- Android入门-从firstactivity开始-button
- 最小生成树之prim算法
- Leetcode: Sliding Window Maximum
- Leetcode Q3:Longest Substring Without Repeating Characters
- word左边左对齐,右边右对齐
- mysql mysql SELECT 自增数显示
- windows系统突然死机,windows系统重新启动后,再启动虚拟机,发现ubuntu系统进入进入initramfs,输入exit都无法退出
- hdoj-3371-Connect the Cities【最小生成树】
- Mysql语法及使用命令总结
- Ubuntu14.04 root登录 ssh 连接