最小生成树之Prime算法(基于优先队列)
2015-09-24 00:14
246 查看
#include <cstdio> #include <queue> #include <cstring> #define MAXN 1010 #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; /* * Prme算法:贪心,适用于稠密图 * 时间复杂度:O(NlogN+M) */ struct node{ int v,dist; node(int v,int dist):v(v),dist(dist){} bool operator<(const node& b)const{ return dist>b.dist; } }; int n, g[MAXN][MAXN],dis[MAXN]; bool vis[MAXN]; priority_queue<node> q; int Prime(int u){ int ans=0; mem(vis,false); while(!q.empty()) q.pop(); for(int i=1;i<=n;++i) if(i!=u){dis[i]=g[u][i]; q.push(node(i,dis[i]));} vis[u]=true; dis[u]=0; int cnt=1; while(!q.empty()){ node tmp=q.top(); q.pop(); u=tmp.v; if(vis[u]) continue; vis[u]=true; ans+=tmp.dist; cnt++; if(cnt>=n) break; for(int i=1;i<=n;++i) if(!vis[i]&&g[u][i]<dis[i]){ q.push(node(i,g[u][i])); dis[i]=g[u][i]; } } return ans; } int main(){ while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&g[i][j]); printf("%d\n",Prime(1)); } return 0; }
相关文章推荐
- email 发送机制
- [LeetCode]Palindrome Linked List
- 极光推送基本写法
- 浅谈——用宏封装单例
- 编写struts.xml文件时提示帮助信息
- Linux补丁学习笔记
- java.sql.SQLException的常见原因
- Codeforces Round #321 (Div. 2) E Kefa and Watch (线段树维护Hash)
- POJ 1064 Cable master (二分查找_经典题!!!)
- 编写一个函数,从一个字符串中去除多余的空格。
- 一个PHP操作大变量的例子
- 题目:寻找缺失的数
- [最小割最大流]UVa1515 - Pool construction
- IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)
- 浅谈——定位的使用
- 注解(Annotation,JDK5.0新特性)
- IIS6 ASP 页的执行造成响应缓冲区超过其配置限制的解决方法
- Java Spring MVC分层设计
- 浅谈——定位(CoreLocation)的简介
- JavaScript的DOM编程--06--两个实验