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 ...
随机推荐
- Nginx中的rewrite指令
转自:http://www.76ku.cn/articles/archives/317 rewite.在server块下,会优先执行rewrite部分,然后才会去匹配location块server中的 ...
- 全屏背景:15个jQuery插件实现全屏背景图像或媒体
动态网站通常利用背景图像或预加载屏幕,以保证所有资源都加载到页面上,在浏览器中充分呈现.现在很多网站都炫耀自己的图像作为背景图像全屏背景,追溯到旧的Flash网站却用自己的方式在HTML资源重布局. ...
- jelq
初级 The Newbie Routine 5 minutes hot wrap 5 minutes manual stretch (ten 30-second stretches) 10 minut ...
- HDU 2010
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int Is_SXH(int num); int main() { int in1, ...
- 一张图告诉你,只会CSS还不够!
会了CSS语法.会了CSS选择器,你就真的会了CSS吗,来看这张图!是超实用的CSS代码段的导览!熊孩子们,赶紧学习去吧! 这是一个Web开发最好的时代,每天都有30000条职位信息,面向互联网,我们 ...
- JSON 问题
{"statusCode":"300","message":"栏目插入出现故障==bannerInfoService.add 栏目 ...
- 【转】WordPress转PHPCMS策略-数据库完美转换
来源:http://www.sjyhome.com/php/wp-to-pc-sql.html WordPress的访问速度不可恭维?那就试试能够生成纯静态的PHPCMS,保证能够让你的网页访问速度有 ...
- 【转】MySQL数据类型和常用字段属性总结
来源:http://www.jb51.net/article/55853.htm 这里先总结数据类型.MySQL中的数据类型大的方面来分,可以分为:日期和时间.数值,以及字符串.下面就分开来进行总结. ...
- [codevs1154][COJ0177][NOIP2006]能量项链
[codevs1154][COJ0177][NOIP2006]能量项链 试题描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这 ...
- UIView动画效果
做出UI界面,实现程序功能,是重中之重,但是通过动画提升使用体验,一般人应该不会拒绝吧. 那么问题又来了,怎么做? 一: 稳扎稳打: 一步一步来吧,毕竟,心急吃不了热豆腐. 1.开启一个动画 2,设置 ...