ACM/ICPC 之 四道MST-Prim解法(POJ1258-POJ1751-POJ2349-POJ3026)
四道MST,适合Prim解法,也可以作为MST练习题。
题意包括在代码中。
POJ1258-Agri Net
水题
//Prim-没什么好说的
//接受一个邻接矩阵,求MST
//Time:0Ms Memory:220K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 105
#define INF 0x3f3f3f3f
int n, m;
int d[MAX][MAX];
int lowcost[MAX];
bool v[MAX];
void prim()
{
int minroad = ;
memset(v, false, sizeof(v));
v[] = true;
for (int i = ; i < n; i++)
lowcost[i] = d[i][];
for (int i = ; i < n; i++)
{
double mind = INF;
int k;
for (int j = ; j < n; j++)
{
if (!v[j] && mind > lowcost[j])
{
mind = lowcost[j];
k = j;
}
} minroad += lowcost[k];
v[k] = true;
for (int j = ; j < n; j++)
if (!v[j]) lowcost[j] = min(d[k][j], lowcost[j]);
}
printf("%d\n", minroad);
}
int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
scanf("%d", &d[i][j]);
prim();
}
return ;
}
POJ1751(ZOJ2048)-Highways
//Prim-好题
//ZOJ2048-POJ1751
//ZOJ中多组样例,两个样例间有一个空格(否则会WA)
//需要记录上一个节点-注意内存限制在10^4K内
//有M个城市已经有通路,输出让N个城市生成最短通路的各边,Special Judge-输出次序不定
//Time:94Ms Memory:4648K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std; #define MAX 755
#define INF 0x3f3f3f3f
#define POW2(x) ((x)*(x))
#define DIS(i,j) (sqrt(POW2(p[i][0] - p[j][0]) + POW2(p[i][1] - p[j][1]))) int n, m;
double p[MAX][];
int fa[MAX]; //记录上一个顶点
double d[MAX][MAX];
double lowcost[MAX];
bool v[MAX]; void prim()
{
memset(v, false, sizeof(v));
v[] = true;
for (int i = ; i <= n; i++)
{
lowcost[i] = d[i][];
fa[i] = ;
}
for (int i = ; i <= n; i++)
{
double mind = INF;
int k;
for (int j = ; j <= n; j++)
{
if (!v[j] && mind > lowcost[j])
{
mind = lowcost[j];
k = j;
}
}
if (mind > 1e-)
printf("%d %d\n", fa[k], k); v[k] = true;
for (int j = ; j <= n; j++)
{
if (!v[j] && lowcost[j] > d[k][j])
{
lowcost[j] = d[k][j];
fa[j] = k;
}
}
}
} int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
scanf("%lf%lf", &p[i][], &p[i][]);
for (int j = ; j < i; j++)
d[i][j] = d[j][i] = DIS(i, j);
}
scanf("%d", &m);
for (int i = ; i < m; i++)
{
int v1, v2;
scanf("%d%d", &v1, &v2);
d[v1][v2] = d[v2][v1] = ;
}
prim();
return ;
}
POJ2349(ZOJ1914)-Arctic Network
//Prim
//POJ2349-ZOJ1914
//有n个前哨可以通过卫星通信(无距离限制),总共m个前哨,相互通信可以通过无线电通信(有距离限制),求所需无线电信号最短距离
//定理:如果去掉所有权值大于d的边后,最小生成树被分割成为k个连通支,图也被分割成为k个连通支(可尝试证明)
//Time:47Ms Memory:2164K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std; #define MAX 501
#define INF 0x3f3f3f3f
#define POW2(x) ((x)*(x))
#define DIS(i,j) (sqrt(POW2(p[i][0] - p[j][0]) + POW2(p[i][1] - p[j][1]))) int n, m;
double p[MAX][]; //point
double d[MAX][MAX]; //distance
double lowcost[MAX];
bool v[MAX]; void prim()
{
memset(lowcost, , sizeof(lowcost));
memset(v, false, sizeof(v));
v[] = true;
for (int i = ; i < m; i++)
lowcost[i] = d[i][];
for (int i = ; i < m; i++)
{
int mind = INF;
int k;
for (int j = ; j < m; j++)
{
if (!v[j] && mind > lowcost[j])
{
mind = lowcost[j];
k = j;
}
}
v[k] = true;
for (int j = ; j < m; j++)
if(!v[j]) lowcost[j] = min(d[k][j], lowcost[j]);
}
} int main()
{
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++)
{
scanf("%lf%lf", &p[i][], &p[i][]);
for (int j = ; j < i; j++)
d[i][j] = d[j][i] = DIS(i, j);
} prim();
sort(lowcost, lowcost + m);
printf("%.2lf\n", lowcost[m - n]);
//G++需要使用printf("%.2f\n", lowcost[m-n]);
//原因查了半天,好像是因为新版GCC标准中将%f和%lf合并为%f的意思
}
return ;
}
POJ3026-Borg Maze
//Prim+BFS
//总是心想着要创造一个新算法,结果越想越麻烦...
//保险做法:找出每个点间的距离,再进行Prim
//Time:79Ms Memory:292K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std; #define MAX 125 //MAX 50的话会RE或WA(博主在55RE,在100WA) struct Point{
int x, y;
int step;
}p; int r, c;
char board[MAX][MAX];
int d[MAX][MAX];
int num[MAX][MAX], cnt;
int lowcost[MAX];
bool v[MAX][MAX];
int mov[][] = { {,}, {-,}, {,}, {,-} }; void bfs(Point p)
{
memset(v, false, sizeof(v));
v[p.x][p.y] = true;
int np = num[p.x][p.y];
queue<Point> q;
p.step = ;
q.push(p);
while (!q.empty())
{
Point cur = q.front();
q.pop();
for (int i = ; i < ; i++)
{
Point t = cur;
t.x += mov[i][];
t.y += mov[i][];
if (t.x > && t.y > && t.x < r && t.y < c && !v[t.x][t.y])
{
if (board[t.x][t.y] == '#') continue;
int nt = num[t.x][t.y];
t.step++;
v[t.x][t.y] = true;
if (board[t.x][t.y] == 'A' || board[t.x][t.y] == 'S')
d[nt][np] = t.step;
q.push(t);
}
}
}
} void prim()
{
int v[MAX];
memset(v, false, sizeof(v));
memset(lowcost, 0x3f, sizeof(lowcost));
v[] = true;
for (int i = ; i < cnt; i++)
lowcost[i] = d[i][]; int minv = ;
for (int i = ; i < cnt; i++)
{
int mind = 0x3f3f3f3f;
int k;
for (int j = ; j < cnt; j++)
{
if (!v[j] && mind > lowcost[j])
{
mind = lowcost[j];
k = j;
}
}
minv += mind;
v[k] = true;
for (int j = ; j < cnt; j++)
if (!v[j]) lowcost[j] = min(lowcost[j], d[k][j]);
}
printf("%d\n", minv);
} int main()
{
int T;
scanf("%d", &T);
while (T--)
{
cnt = ;
scanf("%d%d", &c, &r);
gets_s(board[]);
for (int i = ; i < r; i++)
{
gets_s(board[i], MAX);
for (int j = ; j < c; j++)
if (board[i][j] == 'S' || board[i][j] == 'A')
num[i][j] = cnt++;
}
for (int i = ; i < r; i++)
for (int j = ; j < c;j++)
if (board[i][j] == 'S' || board[i][j] == 'A')
{
p.x = i; p.y = j;
bfs(p);
}
prim();
}
return ;
}
ACM/ICPC 之 四道MST-Prim解法(POJ1258-POJ1751-POJ2349-POJ3026)的更多相关文章
- ACM/ICPC 之 四道MST-Kruskal解法-练习题(POJ1251-POJ1287-POJ2031-POJ2421)
由于题目简单,部分题意写在代码中(简单题就应该多练英文...),且较少给注释,需要注意的地方会写在代码中,虽然四个题意各有千秋,但万变不离其宗,细细思考一番会发现四道题都属于很直接的最小生成树问题,由 ...
- ACM/ICPC 之 判别MST唯一性-Kruskal解法(POJ1679)
判别MST是否唯一的例题. POJ1679-The Unique MST 题意:给定图,求MST(最小生成树)是否唯一,唯一输出路径长,否则输出Not Unique! 题解:MST是否唯一取决于是否有 ...
- ACM/ICPC 之 Prim范例(ZOJ1586-POJ1789(ZOJ2158))
两道Prim解法范例题型,简单的裸Prim,且两题相较以边为重心的Kruskal解法而言更适合以点为重心扩展的Prim解法. ZOJ1586-QS Network 题意:见Code 题解:直接的MST ...
- 【转】lonekight@xmu·ACM/ICPC 回忆录
转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...
- ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873
Football Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
队名:Unlimited Code Works(无尽编码) 队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- POJ-1679.The Unique MST.(Prim求次小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39561 Accepted: 14444 ...
随机推荐
- Jetty与tomcat的比较
Google 应用系统引擎最初是以 Apache Tomcat 作为其 webserver/servlet 容器的,但最终将切换到 Jetty 上. 这个决定让许多开发人员都诧异的想问:为什么要做这样 ...
- LINUX命令总结 -------来自 水滴娃娃 的CSDN
LINUX命令总结 标签: LINUX命令总结 2014-01-27 15:54 41039人阅读 评论(1) 收藏 举报 分类: linux(1) 版权声明:本文为博主原创文章,未经博主允许不得 ...
- Android应用如何监听自己是否被卸载及卸载反馈功能的实现
一个应用被用户卸载肯定是有理由的,而开发者却未必能得知这一重要的理由,毕竟用户很少会主动反馈建议,多半就是用得不爽就卸,如果能在被卸载后获取到用户的一些反馈,那对开发者进一步改进应用是非常有利的.目前 ...
- myeclipse的项目导入到eclipse下,com.sun.org.apache.commons.beanutils.BeanUtils不能导入
com.sun.org.apache.commons.beanutils.BeanUtils这个包不能引入了怎么办自己下了个org.apache.commons的jar包了之后,改成import or ...
- CentOS6.3编译安装Memcached集群分布式缓存代理Magent-0.6出错汇总
参考文章:Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解,搭建Magent,在编译的过程中会出现很多错误: #编译安装安装magent到 /usr/local/mage ...
- PHP通过访问第三方接口,根据IP地址获取所在城市
<?php header('Content-Type:text/html;Charset=utf-8'); /** * 获取IP地址 * * @return string */ function ...
- 什么是H标签?H1,H2,H3标签?以及和strong标签使用的方法及重要性
大家都知道,seo的一个很重要的一点就是要把网站做的条理清晰,让搜索引擎很容易的读明白,这个条理清晰不仅体现在网站的物理路径,url等地 方.在<h1><h2><h3&g ...
- ajax状态
ajax的几个状态 Uninitialized 初始化状态.XMLHttpRequest 对象已创建或已被 abort() 方法重置. Open open() 方法已调用,但是 send() 方法未调 ...
- 获取MAC地址的几种方式
.NET 后台中 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
- fontconfig编译出错
编译fontconfig编译时出错: 出错configure: error: You must have freetype installed; see http://www.freetype.org ...