四道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)的更多相关文章

  1. ACM/ICPC 之 四道MST-Kruskal解法-练习题(POJ1251-POJ1287-POJ2031-POJ2421)

    由于题目简单,部分题意写在代码中(简单题就应该多练英文...),且较少给注释,需要注意的地方会写在代码中,虽然四个题意各有千秋,但万变不离其宗,细细思考一番会发现四道题都属于很直接的最小生成树问题,由 ...

  2. ACM/ICPC 之 判别MST唯一性-Kruskal解法(POJ1679)

    判别MST是否唯一的例题. POJ1679-The Unique MST 题意:给定图,求MST(最小生成树)是否唯一,唯一输出路径长,否则输出Not Unique! 题解:MST是否唯一取决于是否有 ...

  3. ACM/ICPC 之 Prim范例(ZOJ1586-POJ1789(ZOJ2158))

    两道Prim解法范例题型,简单的裸Prim,且两题相较以边为重心的Kruskal解法而言更适合以点为重心扩展的Prim解法. ZOJ1586-QS Network 题意:见Code 题解:直接的MST ...

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

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

  5. ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))

    祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...

  6. 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 ...

  7. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

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

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

  9. POJ-1679.The Unique MST.(Prim求次小生成树)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39561   Accepted: 14444 ...

随机推荐

  1. 数论只会GCD。。。

    一些关于GCD的代码.... #include <iostream> #include <cstdio> #include <cstring> using name ...

  2. 利用session防止用户未经登录而直接访问

    在编写项目的时候,突然想如果按常理出牌,不首先进入登录界面而直接访问网页内容,可不可以呢?如此一来便尝试了一下,整的可以直接进入管理员页面,获取完全的管理权限.于是在网上查看了一下解决方案,学习了一下 ...

  3. dede自定义表单增加添加时间怎么弄

    我们在用dedecms添加自定义表单时有时想要设置一个用户提交的时间,方便查询,比如我们的客服人员查询昨天晚上下班后有哪些订单是刚生成的,比较好查看,如下图所示.那么,dedecms自定义表单增加添加 ...

  4. jekyll 安装过程

    如果有, linux以源码包方式发布, 方便,快捷, 容易出错,安装内容难找到,版本容易冲突.兼容性会出错.如何解决这种方式:1.上网查找答案,你遇到的别人也有,关键词匹配到,好像没有别的办法解决了, ...

  5. Windows 8 IIS中配置PHP运行环境的方法

    在Windows 8 的IIS(8.0)中搭建PHP运行环境: 一:安装IIS服务器 1.进入控制面板>>程序和功能>>打开或关闭Windows 功能,找到Internet信息 ...

  6. linux 学习之路

    很多同学接触Linux不多,对Linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段. 下来我将 ...

  7. jquery 平滑锚

    setTimeout('$("html,body").animate({ scrollTop: $(".title").offset().top }, 1000 ...

  8. 如何建立一个完整的游戏AI

    http://blog.friskit.me/2012/04/how-to-build-a-perfect-game-ai/ 人工智能(Artificial Intelligence)在游戏中使用已经 ...

  9. 关于python 序列 深拷贝

    如果要在循环内修改正在迭代的序列(例如,复制所选的项目),建议首先制作副本.迭代序列不会隐式地创建副本.使用切片就可以很容易地做到: >>> >>> for w i ...

  10. 剑指Offer 整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...