四道MST,适合Prim解法,也可以作为MST练习题。

  题意包括在代码中。


POJ1258-Agri Net

  水题

 1 //Prim-没什么好说的
 2 //接受一个邻接矩阵,求MST
 3 //Time:0Ms    Memory:220K
 4 #include<iostream>
 5 #include<cstring>
 6 #include<cstdio>
 7 #include<algorithm>
 8 using namespace std;
 9 #define MAX 105
10 #define INF 0x3f3f3f3f
11 int n, m;
12 int d[MAX][MAX];
13 int lowcost[MAX];
14 bool v[MAX];
15 void prim()
16 {
17     int minroad = 0;
18     memset(v, false, sizeof(v));
19     v[0] = true;
20     for (int i = 1; i < n; i++)
21         lowcost[i] = d[i][0];
22     for (int i = 1; i < n; i++)
23     {
24         double mind = INF;
25         int k;
26         for (int j = 1; j < n; j++)
27         {
28             if (!v[j] && mind > lowcost[j])
29             {
30                 mind = lowcost[j];
31                 k = j;
32             }
33         }
34
35         minroad += lowcost[k];
36         v[k] = true;
37         for (int j = 1; j < n; j++)
38             if (!v[j])    lowcost[j] = min(d[k][j], lowcost[j]);
39     }
40     printf("%d\n", minroad);
41 }
42 int main()
43 {
44     while (scanf("%d", &n) != EOF)
45     {
46         for (int i = 0; i < n; i++)
47             for (int j = 0; j < n; j++)
48                 scanf("%d", &d[i][j]);
49         prim();
50     }
51     return 0;
52 }


POJ1751(ZOJ2048)-Highways

 1 //Prim-好题
 2 //ZOJ2048-POJ1751
 3 //ZOJ中多组样例,两个样例间有一个空格(否则会WA)
 4 //需要记录上一个节点-注意内存限制在10^4K内
 5 //有M个城市已经有通路,输出让N个城市生成最短通路的各边,Special Judge-输出次序不定
 6 //Time:94Ms    Memory:4648K
 7 #include<iostream>
 8 #include<cstring>
 9 #include<cstdio>
10 #include<cmath>
11 #include<algorithm>
12 using namespace std;
13
14 #define MAX 755
15 #define INF 0x3f3f3f3f
16 #define POW2(x) ((x)*(x))
17 #define DIS(i,j) (sqrt(POW2(p[i][0] - p[j][0]) + POW2(p[i][1] - p[j][1])))
18
19 int n, m;
20 double p[MAX][2];
21 int fa[MAX];    //记录上一个顶点
22 double d[MAX][MAX];
23 double lowcost[MAX];
24 bool v[MAX];
25
26 void prim()
27 {
28     memset(v, false, sizeof(v));
29     v[1] = true;
30     for (int i = 2; i <= n; i++)
31     {
32         lowcost[i] = d[i][1];
33         fa[i] = 1;
34     }
35     for (int i = 2; i <= n; i++)
36     {
37         double mind = INF;
38         int k;
39         for (int j = 2; j <= n; j++)
40         {
41             if (!v[j] && mind > lowcost[j])
42             {
43                 mind = lowcost[j];
44                 k = j;
45             }
46         }
47         if (mind > 1e-5)
48             printf("%d %d\n", fa[k], k);
49
50         v[k] = true;
51         for (int j = 2; j <= n; j++)
52         {
53             if (!v[j] && lowcost[j] > d[k][j])
54             {
55                 lowcost[j] = d[k][j];
56                 fa[j] = k;
57             }
58         }
59     }
60 }
61
62 int main()
63 {
64     scanf("%d", &n);
65     for (int i = 1; i <= n; i++)
66     {
67         scanf("%lf%lf", &p[i][0], &p[i][1]);
68         for (int j = 1; j < i; j++)
69             d[i][j] = d[j][i] = DIS(i, j);
70     }
71     scanf("%d", &m);
72     for (int i = 0; i < m; i++)
73     {
74         int v1, v2;
75         scanf("%d%d", &v1, &v2);
76         d[v1][v2] = d[v2][v1] = 0;
77     }
78     prim();
79     return 0;
80 }


POJ2349(ZOJ1914)-Arctic Network

 1 //Prim
 2 //POJ2349-ZOJ1914
 3 //有n个前哨可以通过卫星通信(无距离限制),总共m个前哨,相互通信可以通过无线电通信(有距离限制),求所需无线电信号最短距离
 4 //定理:如果去掉所有权值大于d的边后,最小生成树被分割成为k个连通支,图也被分割成为k个连通支(可尝试证明)
 5 //Time:47Ms    Memory:2164K
 6 #include<iostream>
 7 #include<cstring>
 8 #include<cstdio>
 9 #include<cmath>
10 #include<algorithm>
11 using namespace std;
12
13 #define MAX 501
14 #define INF 0x3f3f3f3f
15 #define POW2(x) ((x)*(x))
16 #define DIS(i,j) (sqrt(POW2(p[i][0] - p[j][0]) + POW2(p[i][1] - p[j][1])))
17
18 int n, m;
19 double p[MAX][2];    //point
20 double d[MAX][MAX];    //distance
21 double lowcost[MAX];
22 bool v[MAX];
23
24 void prim()
25 {
26     memset(lowcost, 0, sizeof(lowcost));
27     memset(v, false, sizeof(v));
28     v[0] = true;
29     for (int i = 1; i < m; i++)
30         lowcost[i] = d[i][0];
31     for (int i = 1; i < m; i++)
32     {
33         int mind = INF;
34         int k;
35         for (int j = 1; j < m; j++)
36         {
37             if (!v[j] && mind > lowcost[j])
38             {
39                 mind = lowcost[j];
40                 k = j;
41             }
42         }
43         v[k] = true;
44         for (int j = 1; j < m; j++)
45             if(!v[j]) lowcost[j] = min(d[k][j], lowcost[j]);
46     }
47 }
48
49 int main()
50 {
51     int T;
52     scanf("%d", &T);
53     while (T--)
54     {
55         scanf("%d%d", &n, &m);
56         for (int i = 0; i < m; i++)
57         {
58             scanf("%lf%lf", &p[i][0], &p[i][1]);
59             for (int j = 0; j < i; j++)
60                 d[i][j] = d[j][i] = DIS(i, j);
61         }
62
63         prim();
64         sort(lowcost, lowcost + m);
65         printf("%.2lf\n", lowcost[m - n]);
66         //G++需要使用printf("%.2f\n", lowcost[m-n]);
67         //原因查了半天,好像是因为新版GCC标准中将%f和%lf合并为%f的意思
68     }
69     return 0;
70 }


POJ3026-Borg Maze

  1 //Prim+BFS
  2 //总是心想着要创造一个新算法,结果越想越麻烦...
  3 //保险做法:找出每个点间的距离,再进行Prim
  4 //Time:79Ms    Memory:292K
  5 #include<iostream>
  6 #include<cstring>
  7 #include<cstdio>
  8 #include<queue>
  9 #include<algorithm>
 10 using namespace std;
 11
 12 #define MAX 125        //MAX 50的话会RE或WA(博主在55RE,在100WA)
 13
 14 struct Point{
 15     int x, y;
 16     int step;
 17 }p;
 18
 19 int r, c;
 20 char board[MAX][MAX];
 21 int d[MAX][MAX];
 22 int num[MAX][MAX], cnt;
 23 int lowcost[MAX];
 24 bool v[MAX][MAX];
 25 int mov[4][2] = { {1,0}, {-1,0}, {0,1}, {0,-1} };
 26
 27 void bfs(Point p)
 28 {
 29     memset(v, false, sizeof(v));
 30     v[p.x][p.y] = true;
 31     int np = num[p.x][p.y];
 32     queue<Point> q;
 33     p.step = 0;
 34     q.push(p);
 35     while (!q.empty())
 36     {
 37         Point cur = q.front();
 38         q.pop();
 39         for (int i = 0; i < 4; i++)
 40         {
 41             Point t = cur;
 42             t.x += mov[i][0];
 43             t.y += mov[i][1];
 44             if (t.x > 0 && t.y > 0 && t.x < r && t.y < c && !v[t.x][t.y])
 45             {
 46                 if (board[t.x][t.y] == '#')    continue;
 47                 int nt = num[t.x][t.y];
 48                 t.step++;
 49                 v[t.x][t.y] = true;
 50                 if (board[t.x][t.y] == 'A' || board[t.x][t.y] == 'S')
 51                     d[nt][np] = t.step;
 52                 q.push(t);
 53             }
 54         }
 55     }
 56 }
 57
 58 void prim()
 59 {
 60     int v[MAX];
 61     memset(v, false, sizeof(v));
 62     memset(lowcost, 0x3f, sizeof(lowcost));
 63     v[0] = true;
 64     for (int i = 1; i < cnt; i++)
 65         lowcost[i] = d[i][0];
 66
 67     int minv = 0;
 68     for (int i = 1; i < cnt; i++)
 69     {
 70         int mind = 0x3f3f3f3f;
 71         int k;
 72         for (int j = 1; j < cnt; j++)
 73         {
 74             if (!v[j] && mind > lowcost[j])
 75             {
 76                 mind = lowcost[j];
 77                 k = j;
 78             }
 79         }
 80         minv += mind;
 81         v[k] = true;
 82         for (int j = 1; j < cnt; j++)
 83             if (!v[j]) lowcost[j] = min(lowcost[j], d[k][j]);
 84     }
 85     printf("%d\n", minv);
 86 }
 87
 88 int main()
 89 {
 90     int T;
 91     scanf("%d", &T);
 92     while (T--)
 93     {
 94         cnt = 0;
 95         scanf("%d%d", &c, &r);
 96         gets_s(board[0]);
 97         for (int i = 0; i < r; i++)
 98         {
 99             gets_s(board[i], MAX);
100             for (int j = 0; j < c; j++)
101                 if (board[i][j] == 'S' || board[i][j] == 'A')
102                     num[i][j] = cnt++;
103         }
104         for (int i = 0; i < r; i++)
105             for (int j = 0; j < c;j++)
106                 if (board[i][j] == 'S' || board[i][j] == 'A')
107                 {
108                     p.x = i; p.y = j;
109                     bfs(p);
110                 }
111         prim();
112     }
113     return 0;
114 }

转载于:https://www.cnblogs.com/Inkblots/p/5380599.html

ACM/ICPC 之 四道MST-Prim解法(POJ1258-POJ1751-POJ2349-POJ3026)相关推荐

  1. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM 最早听说ACM/ICP ...

  2. 厦门大学lonekight ACM/ICPC 回忆录

    初识ACM 最早听说ACM/ICPC这项赛事是在大三上的算法课上张老师提到的,当时我们学校的组织参加这项活动才刚刚起步,我也没太在意,总觉得那是非常遥远的事,事实上当时我也从未相当如今我们能获得现在的 ...

  3. 2016 ACM / ICPC Asia dalian Regional Contest 题解(11 / 11)【每日亿题2021 / 2 / 17】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A .(2017 ACM ICPC dalian H)To begin or not to be ...

  4. 大量ACM/ICPC书籍与网站资源

    算法丛书分享 1.Concrete Mathematics --- A Foundation For Computer Science Ronald L. Graham , Donald E. Knu ...

  5. Goodbye ACM/ICPC!

    区域赛打完有一阵子了,感觉心里没着没落的,总感觉没画完句号,一边深知自己已是退役狗,一边又感觉自己随时可以开始做题,真想继续下去啊,但是时间已经不允许了.天下无不散之宴席,也到了说再见的时候了. 两年 ...

  6. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  7. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  8. 2019 ACM - ICPC 西安邀请赛 B. Product (杜教筛) 简单数论(bushi)

    G.(2019 ACM/ICPC 全国邀请赛(西安)B) Product Weblink https://nanti.jisuanke.com/t/39269 Problem && S ...

  9. 解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. 接口级故障的应对方法
  2. Linux find
  3. jdbc,mybatis,hibernate各自优缺点及区别
  4. Vision Transformer 论文
  5. java stream 求和_谈谈Java任务的并行处理
  6. 【图解+全文】工信部关于印发“十四五”大数据产业发展规划的通知
  7. javascript onbeforeunload与onunload事件
  8. 电脑向linux板卡传文件,ARM 开发板嵌入式linux系统与主机PC通过串口传输文件
  9. bzoj2463: [中山市选2009]谁能赢呢?(博弈论)
  10. Html鼠标右键菜单代码
  11. 银行信贷系统java_java毕业设计_springboot框架的银行信贷系统
  12. 产品经理项目流程(四)——需求文档
  13. php实现登录验证码_php如何实现登录验证码
  14. 解读SPSS多元方差分析中的多因素多变量的相互影响
  15. Moive-Pages
  16. Java实现控制台版CS
  17. favicon自动获取_wordpress网站友情链接页面使用DNSPod自动获取网站favicon图标教程...
  18. Java练手项目2:基于Java的坦克大战游戏(学习Java必备!!!)
  19. 根据当前ip地址获取地理位置
  20. 高数_证明_罗尔定理

热门文章

  1. hdu 1176 馅饼
  2. apt-get for ubuntu 工具简介
  3. 生成的数据库脚本没有注释?
  4. [恢]hdu 1239
  5. Eclipse4JavaEE安装SpringBoot
  6. 简单的文件上传功能实现(java)
  7. Strus2中关于ValueStack详解
  8. Fragment的保存
  9. REMarkerClusterer
  10. 价值投资/指标选股(akshare)