POJ 1258 Agri-Net(最小生成树)
2016-03-16 10:54
309 查看
题意:
balabalabala,总之就是给定一个矩阵,求最小生成树
思路:
好久没敲最小生成树,发现已经不会写了。。。。QaQ
这里用了prim算法。大体思路就是把节点放在两个集合s1和s2里。刚开始s1里只有起始点,然后从这个点出发找与它直接相连的离它最近的点,从s2中取出存入s1,把权值加入记录最小生成树大小的sum里,然后再从s1里的点出发,继续找与s1里的点直接相连的最近的点,加入。。。。balabalabala,最后所有点都被加进s1了,这样就得到了最小生成树。。。
代码:
balabalabala,总之就是给定一个矩阵,求最小生成树
思路:
好久没敲最小生成树,发现已经不会写了。。。。QaQ
这里用了prim算法。大体思路就是把节点放在两个集合s1和s2里。刚开始s1里只有起始点,然后从这个点出发找与它直接相连的离它最近的点,从s2中取出存入s1,把权值加入记录最小生成树大小的sum里,然后再从s1里的点出发,继续找与s1里的点直接相连的最近的点,加入。。。。balabalabala,最后所有点都被加进s1了,这样就得到了最小生成树。。。
代码:
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int edge[100 + 10][100 + 10]; int dist[100 + 10]; bool vis[100 + 10]; int prime(int u0, int n) { memset(vis, false, sizeof(vis)); for(int i = 1; i <= n; i++) dist[i] = edge[u0][i]; vis[u0] = true; int sum = 0; for(int i = 1; i <= n - 1; i++) { int Min = 100000 + 10; int v = 0; for(int j = 1; j <= n; j++) { if(!vis[j] && dist[j] < Min) { v = j; Min = dist[j]; } } vis[v] = true; sum = sum + Min; for(int j = 1; j <= n; j++) if(!vis[j] && edge[v][j] < dist[j]) dist[j] = edge[v][j]; } return sum; } int main() { int n; while(scanf("%d", &n)!=EOF) { for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) scanf("%d", &edge[i][j]); printf("%d\n", prime(1,n)); } return 0; }
相关文章推荐
- RSA秘钥对生成(Linux下使用Openssl)
- 集成自动打包Jenkins
- git 网上拉代码遇到 error: RPC failed; result=18, HTTP code = 200 | 2.12 MiB/s
- node.js之流学习(Stream)
- Hibernate注解版关联关系映射全解析+案例
- 修改VS2008(vc)中工程解决方案类的名字
- 理解devfs,sysfs,udev
- 【笔记】从eclipse移植AS的各种情况
- JavaScript事件机制详解
- 目标跟踪Camshift算法(Opencv实现)
- 杭电ACM1004
- iOS开发之post 头像上传
- 如何使用github和git进行团队合作开发(队友和owner的仓库连接)
- iOS UI自动化测试与代码覆盖率
- Java 面试
- 事务块TransactionScope使用
- kettle 5.1.0 连接 Hadoop hive 2 (hive 1.2.1)
- 深拷贝和浅拷贝详解
- [置顶] ListView 优化篇:从 BaseAdapter 到 BaseViewHolder
- snmptrap的使用方法