POJ 2485-Highways
http://poj.org/problem?id=2485
这是道最小生成树的题目,求的是最小生成树中最大边的权值。开始就想到用kruskal算法去做,
因为边是从小到大排序的,所以保证最后一条加入生成树的边的权值是最小生成树当中最大的。
Kruskal仅排序用的时间是O(mlog m),其中m 为n^2数量级的,为边的总数。
再说说prim算法,这个算法严格来说是今天才学的。在我看来,prim算法的精髓在于传递,建
立最小生成树的方法就是一个传递的过程,先将编号为0的点作为树根,然后找到离0最近的一点j,加
入生成树中,然后找离j最近的,每次都要更新lowc的值。找最大边的权值话就每次用加入的minc值
与max比较就行了。
下面是两种不同算法的代码:
/*kruskal算法Memory: 812K Time: 329MSLanguage: C++ Result: Accepted*/#include<cstdio>#include<cstring>#include<cstdlib>const int MAXN = 505;int u[MAXN * MAXN], v[MAXN * MAXN], w[MAXN * MAXN], p[MAXN], r[MAXN * MAXN];int e1, res, n, m; int find_set( int x){return p[x] == x ? x : ( p[x] = find_set( p[x]));} int cmp( const void *_p, const void *_q){int *p = (int *)_p;int *q = (int *)_q;return w[*p] - w[*q];} void kruskal(){//res = 0; for( int i = 0; i < n; i ++) p[i] = i;for( int i = 0; i < m; i ++) r[i] = i; qsort( r, m, sizeof(r[0]), cmp);for( int i = 0; i < m; i ++) {int e = r[i]; int x = find_set(u[e]), y = find_set(v[e]);if( x != y) { res += w[e]; p[x] = y; e1 = e;} }} int main(){int T; scanf( "%d", &T);while( T --) { scanf( "%d", &n); m = 0;for( int i = 0; i < n; i ++)for( int j = 0; j < n; j ++) { u[m] = i, v[m] = j; scanf( "%d", &w[m ++]); } kruskal(); printf( "%d\n", w[e1]); }return 0;}
/*prim算法Memory: 564K Time: 141MSLanguage: C++ Result: Accepted*/#include<cstdio>#include<cstring>#include<cstdlib>const int MAXN = 505;bool vis[MAXN];int w[MAXN][MAXN], lowc[MAXN], max, n, res;const int INF = 0x3F3F3F3F;void prim(){ max = 0;//res = 0; int minc, p; memset( vis, false, sizeof vis); vis[0] = true;for( int i = 1; i < n; i ++) lowc[i] = w[0][i];for( int i = 1; i < n; i ++) { minc = INF, p = -1;for( int j = 0; j < n; j ++)if( !vis[j] && minc > lowc[j]){ minc = lowc[j]; p = j; } vis[p] = true; max = max > minc ? max : minc;//res += minc;// 更新lowc[j]的值。 for( int j = 0; j < n; j ++)if( !vis[j] && lowc[j] > w[p][j]) lowc[j] = w[p][j]; }} int main(){int T; scanf( "%d", &T);while( T --) { scanf( "%d", &n);for( int i = 0; i < n; i ++)for( int j = 0; j < n; j ++) scanf( "%d", &w[i][j]); prim(); printf( "%d\n", max); }return 0;}
今天想着将kruskal算法的写法改了下,记录树中边的数目,有n-1条边后跳出循环,省了那么一点时间。
/*Accepted 800K 282MS C++ 1373B 2012-07-24 08:40:52*/ #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std;const int MAXN = 505; int p[MAXN], r[MAXN * MAXN], u[MAXN * MAXN], v[MAXN * MAXN], w[MAXN * MAXN]; int n, m, ret;bool cmp( const int i, const int j) {return w[i] < w[j]; }int find(int x) {return p[x] == x ? x : (p[x] = find(p[x])); }void init() {int i, j, val;m = 0;for( i = 1; i <= n; i ++)for( j = 1; j <= n; j ++){scanf( "%d", &val);if(i == j) continue;u[m] = i, v[m] = j, w[m ++] = val;} }void kruskal() {int ans, cnt, e;ans = cnt = 0;int nx, ny, i, j;for( i = 1; i <= n; i ++)p[i] = i;for( i = 0; i < m; i ++)r[i] = i;sort( r, r + m, cmp);for( i = 0; i < m; i ++){e = r[i];nx = find(u[e]), ny = find(v[e]);if( nx != ny){p[nx] = ny;ans += w[e];cnt ++;if( n - 1 == cnt) {ret = w[e];break;}}} }int main() {int T;scanf( "%d", &T);while( T --){scanf( "%d", &n);init();kruskal();printf( "%d\n", ret);//printf( "\n"); }return 0; }
转载于:https://www.cnblogs.com/Yu2012/archive/2012/03/31/2427775.html
POJ 2485-Highways相关推荐
- POJ 2485 - Highways(求最小生成树的最大权值-Kruskal算法)
题目 Language:Default Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 36414 Accept ...
- POJ 2485 Highways(最小生成树 Prim)
Highways 大意:给你一个用邻接矩阵形式存储的有n个顶点的无向图,让你求它的最小生成树并求出在这个生成树里面最大的边的权值. 思路:用Prim求,判断条件改一下就行. PS:dis数组初始化 ...
- poj 2485 Highways
答案就是最小生成树中权值最大的边 #include<cstdio> #include<cstring> #include<cmath> #include<al ...
- POJ 2485 Highways (prim最小生成树)
对于终于生成的最小生成树中最长边所连接的两点来说 不存在更短的边使得该两点以不论什么方式联通 对于本题来说 最小生成树中的最长边的边长就是使整个图联通的最长边的边长 由此可知仅仅要对给出城市所抽象出的 ...
- 【POJ 2485】 Highways
[POJ 2485] Highways 最小生成树模板 Prim #includeusing namespace std;int mp[501][501]; int dis[501]; bool vi ...
- 【POJ - 2485 】Highways (最小生成树,Prim算法,瓶颈生成树)
题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. ...
- POJ - 2485(最小生成树.prime)
题目链接: http://poj.org/problem?id=2485 题目: Highways Time Limit: 1000MS Memory Limit: 65536K Total Su ...
- POJ 1751 Highways (kruskal)
题目链接:http://poj.org/problem?id=1751 题意是给你n个点的坐标,然后给你m对点是已经相连的,问你还需要连接哪几对点,使这个图为最小生成树. 这里用kruskal不会超时 ...
- poj 1751 Highways 最小生成树Kruskal(、Prim还没写
OJ交不了,,, #pragma warning(disable:4996) #include<iostream> #include<string> #include<c ...
- 2019.9.18最小生成树知识点总结
HDU 4081 Qin Shi Huang's National Road System(次小生成树-Kruskal) 博主的方法很好,但是有疑问,为什么不能将最多人口的两城市的距离设置为0,在进行 ...
最新文章
- 仿即刻的点赞滚动放大波纹图标
- 位图 查找重复 排序 存数据
- Python任务调度模块 – APScheduler,Flask-APScheduler实现定时任务
- 从C语言的角度重构数据结构系列(四)-静态链表动态链表
- 若依JAVA开源框架自动生成代码步骤记录-创建子module以及导入子module相关问题
- csv数据去重 python_python批量查询、汉字去重处理CSV文件
- 用户体验与可用性测试_可用性作为用户体验的原则
- IE8采用IE7模式
- CAN总线知识点概述
- 很口语blood-aholic
- BZOJ2759 一个动态树好题
- Docker本地私有仓库的建立
- 五子棋的禁手c++语言实现,C++实现简单五子棋游戏
- NSString属性什么时候用copy,什么时候用strong?【转】
- jQuery实现留言板
- (四)数据建模和数据库设计
- 计算机软件 属于特许权,​软件使用权是否属于无形资产
- Android学习计划 Android学习总结
- 帆软复选框根据数据库值显示勾选效果
- JS把加号当成连接符
热门文章
- 本科计算机科学与技术专业物理,中国工程物理研究院职工工学院计算机科学与技术(本科)专业介绍...
- Mybatis使用总结
- java 变量 占用空间_Java-空变量是否需要内存空间
- ppt设置外观样式_PPT怎么做?如何做出好看的PPT?
- javafx 图片作按钮_JavaFX - 按钮编辑树视图节点文本
- 058_Unicode字符官方标准九
- java获取content-disposition_java – Content-Disposition附件不起作用 – 将...
- php 计算字符串相邻最大重复数_php如何解决字符串中重复字符的次数并且排序输出的方法...
- r mysql追加_将RMySQL程序包添加到R失败(在Windows上)?
- Oralce 目录结构