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

  四道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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、bootstrap4基础(flex布局)

1.1 Flex弹性布局&#xff08;一&#xff09; <div class"d-flex flex-column border border-danger justify-content-end mb-5" style"height: 200px;"><div class"p-2 border border-success">one</div><div class"…

《数据结构与算法之美》学习汇总

此篇文章是对自己学习这门课程的一个总结和课后的一些练习&#xff0c;做一个汇总&#xff0c;希望对大家有帮助。本人是半路程序员&#xff0c;2018年2月开始学习C的&#xff0c;下面的代码基本都是C11版本的&#xff0c;代码有错误的地方请不吝留言赐教。附有部分练习LeetCod…

android简单的夜间模式

现在android项目values下打 attrs.xml <?xml version"1.0" encoding"utf-8"?> <resources><attr name"bookimage" format"reference|color" /><attr name"tvcolor" format"reference|color&quo…

三、bootstrap4 组件(警告和提示框、徽章和面包屑、按钮按钮组、卡片、列表组、导航和选项卡、分页和进度条、巨幕和旋转图标、轮播图、折叠菜单、下拉菜单、导航条、滚动监听、轻量弹框、模态框、表单)

1.1 警告提示框 1.2 徽章和面包屑 1.3 按钮和按钮组 1.4 卡片 1.5 列表组 1.6 导航和选项卡 1.7 分页和进度条 1.8 巨幕和旋转图标 1.9 轮播图 1.10 折叠菜单 1.11 下拉菜单 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title&…

吴恩达-《深度学习DeepLearning》汇总目录

从2019年2月底开始学习《数据结构与算法之美》&#xff0c;王争老师的课程非常好&#xff0c;到2019年8月底已经学完一遍&#xff0c;后面还要多次复习巩固以及OJ刷题。生命不息&#xff0c;学习不止&#xff0c;又要开始新的篇章了–《机器学习》&#xff0c;有点小兴奋&#…

javascript常用内置对象总结(重要)

Javascript对象总结 JS中内置了17个对象&#xff0c;常用的是Array对象、Date对象、正则表达式对象、string对象、Global对象 Array对象中常用方法&#xff1a; Concat&#xff08;&#xff09;&#xff1a;表示把几个数组合并成一个数组。 Join&#xff08;&#xff09;&#…

十三、axios框架学习

一、axios的基本使用 1.1 安装axios 执行命令&#xff1a;npm install axios --save 1.2 发送get请求演示 1.3 发送并发请求 有时候, 我们可能需求同时发送两个请求 使用axios.all, 可以放入多个请求的数组.axios.all([]) 返回的结果是一个数组&#xff0c;使用 axios.sp…

LeetCode解题汇总目录

此篇为学习完《数据结构与算法之美》后&#xff0c;在LeetCode刷题的汇总目录&#xff0c;方便大家查找&#xff08;CtrlFind&#xff09;&#xff0c;一起刷题&#xff0c;一起PK交流&#xff01;如果本文对你有帮助&#xff0c;可以给我点赞加油&#xff01; Updated on 2022…

java——IO流整理(一)

一、基础 1.字节、字符 位&#xff08;bit&#xff09;   &#xff1a;二进制中的一个1或0称为1位字节&#xff08;byte&#xff09; &#xff1a;8个二进制位称为一个字节字符     &#xff1a;一个自然符号称为字符。英文符号&#xff08;1个字节&#xff09;、中文符…

Node.js学习笔记

Node介绍 为什么要学习Node.js 企业需求 具有服务端开发经验更改front-endback-end全栈开发工程师基本的网站开发能力 服务端前端运维部署 多人社区 Node.js是什么 Node.js是JavaScript 运行时通俗易懂的讲&#xff0c;Node.js是JavaScript的运行平台Node.js既不是语言&am…

《统计学习方法》学习笔记目录

此篇为 李航老师著的《统计学习方法》的学习笔记汇总&#xff0c;准备学习并敲一敲代码&#xff0c;还请大家不吝赐教&#xff01;updated on 2020.4.26 一些相关的实践&#xff1a;请查阅机器学习 1. 统计学习及监督学习概论 2. 感知机&#xff08;Perceptron&#xff09; …

iOS: 属性声明strong和retain竟然不一样

今天和同事在处理一处用strong声明的Block属性引发的问题时偶然发现的。在诸多教程中都会讲到&#xff1a;声明属性时用strong或者retain效果是一样的&#xff08;貌似更多开发者更倾向于用strong&#xff09;。不过在声明Block时&#xff0c;使用strong和retain会有截然不同的…

一、node.js搭建最简单的服务器

node.js搭建最简单的服务器 代码演示&#xff1a; // 1. 加载http核心模块 var http require(http)// 2. 使用http.createServer()方法创建一个Web服务器 // 返回一个Server实例 var server http.createServer()// 3. 服务器干嘛&#xff1f; // 提供服务&#xff1a; 对数…

DDD 领域驱动设计-如何 DDD?

注&#xff1a;科比今天要退役了&#xff0c;我是 60 亿分之一&#xff0c;满腹怀念&#xff5e;??? 前几天看了园友的一篇文章《我眼中的领域驱动设计》&#xff0c;文中有段话直击痛点&#xff1a;有人误认为项目架构中加入 Repository&#xff0c;Domain&#xff0c;Valu…

二、搭建Apache服务器 模板引擎

1. 案例&#xff1a;搭建简单的Apache服务器 var http require(http) var fs require(fs)var server http.createServer()var wwwDir D:\\CWork\\node.js黑马程序员\\study_nodejs\\day02\\code\\wwwserver.on(request, function(req, res) {var url req.urlfs.readFile(…

三、案例:留言板 url.parse()

1. url.parse()的使用 2. 留言板案例 index.html: <!DOCTYPE html> <!-- saved from url(0027)http://192.168.150.76:3000/ --> <html lang"en"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8…

iOS开发——收集Github上的iOS控件和开发资料

https://github.com/JanzTam/MyGithubMark转载于:https://www.cnblogs.com/adople/p/5391912.html

四、模块系统

什么是模块化 文件作用域(模块是独立的&#xff0c;在不同的文件使用必须要重新引用)【在node中没有全局作用域&#xff0c;它是文件模块作用域】通信规则 加载require导出exports CommonJS模块规范 在Node中的JavaScript还有一个重要的概念&#xff0c;模块系统。 模块作用…

Jquery 实现原理之 Ajax

一&#xff1a;Jquery Ajax底层接口有&#xff1a;$.ajaxPrefilters、$.ajaxTransport、$.ajaxSettings、$ajaxSetup、$ajaxSettings; 其中$.ajaxPrefilters 和 $.ajaxTransport是通过inspectPrefiltersOrTransports构造器来创建的; $.ajaxPrefilters&#xff1a;是一个前置过滤…

一、AJAX学习笔记——原生AJAX (ajax简介、XML简介、ajax优缺点、ajax的使用)

第 1 章&#xff1a;原生 AJAX 1.1 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c; 最大的优势&#xff1a;无刷新获取数据。 AJAX 不是新的编程语言&#xff0c;而是…