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相关推荐

  1. POJ 2485 - Highways(求最小生成树的最大权值-Kruskal算法)

    题目 Language:Default Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 36414 Accept ...

  2. POJ 2485 Highways(最小生成树 Prim)

    Highways   大意:给你一个用邻接矩阵形式存储的有n个顶点的无向图,让你求它的最小生成树并求出在这个生成树里面最大的边的权值. 思路:用Prim求,判断条件改一下就行. PS:dis数组初始化 ...

  3. poj 2485 Highways

    答案就是最小生成树中权值最大的边 #include<cstdio> #include<cstring> #include<cmath> #include<al ...

  4. POJ 2485 Highways (prim最小生成树)

    对于终于生成的最小生成树中最长边所连接的两点来说 不存在更短的边使得该两点以不论什么方式联通 对于本题来说 最小生成树中的最长边的边长就是使整个图联通的最长边的边长 由此可知仅仅要对给出城市所抽象出的 ...

  5. 【POJ 2485】 Highways

    [POJ 2485] Highways 最小生成树模板 Prim #includeusing namespace std;int mp[501][501]; int dis[501]; bool vi ...

  6. 【POJ - 2485 】Highways (最小生成树,Prim算法,瓶颈生成树)

    题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. ...

  7. POJ - 2485(最小生成树.prime)

    题目链接: http://poj.org/problem?id=2485 题目: Highways Time Limit: 1000MS   Memory Limit: 65536K Total Su ...

  8. POJ 1751 Highways (kruskal)

    题目链接:http://poj.org/problem?id=1751 题意是给你n个点的坐标,然后给你m对点是已经相连的,问你还需要连接哪几对点,使这个图为最小生成树. 这里用kruskal不会超时 ...

  9. poj 1751 Highways 最小生成树Kruskal(、Prim还没写

    OJ交不了,,, #pragma warning(disable:4996) #include<iostream> #include<string> #include<c ...

  10. 2019.9.18最小生成树知识点总结

    HDU 4081 Qin Shi Huang's National Road System(次小生成树-Kruskal) 博主的方法很好,但是有疑问,为什么不能将最多人口的两城市的距离设置为0,在进行 ...

最新文章

  1. 仿即刻的点赞滚动放大波纹图标
  2. 位图 查找重复 排序 存数据
  3. Python任务调度模块 – APScheduler,Flask-APScheduler实现定时任务
  4. 从C语言的角度重构数据结构系列(四)-静态链表动态链表
  5. 若依JAVA开源框架自动生成代码步骤记录-创建子module以及导入子module相关问题
  6. csv数据去重 python_python批量查询、汉字去重处理CSV文件
  7. 用户体验与可用性测试_可用性作为用户体验的原则
  8. IE8采用IE7模式
  9. CAN总线知识点概述
  10. 很口语blood-aholic
  11. BZOJ2759 一个动态树好题
  12. Docker本地私有仓库的建立
  13. 五子棋的禁手c++语言实现,C++实现简单五子棋游戏
  14. NSString属性什么时候用copy,什么时候用strong?【转】
  15. jQuery实现留言板
  16. (四)数据建模和数据库设计
  17. 计算机软件 属于特许权,​软件使用权是否属于无形资产
  18. Android学习计划 Android学习总结
  19. 帆软复选框根据数据库值显示勾选效果
  20. JS把加号当成连接符

热门文章

  1. 本科计算机科学与技术专业物理,中国工程物理研究院职工工学院计算机科学与技术(本科)专业介绍...
  2. Mybatis使用总结
  3. java 变量 占用空间_Java-空变量是否需要内存空间
  4. ppt设置外观样式_PPT怎么做?如何做出好看的PPT?
  5. javafx 图片作按钮_JavaFX - 按钮编辑树视图节点文本
  6. 058_Unicode字符官方标准九
  7. java获取content-disposition_java – Content-Disposition附件不起作用 – 将...
  8. php 计算字符串相邻最大重复数_php如何解决字符串中重复字符的次数并且排序输出的方法...
  9. r mysql追加_将RMySQL程序包添加到R失败(在Windows上)?
  10. Oralce 目录结构