两道Prim解法范例题型,简单的裸Prim,且两题相较以边为重心的Kruskal解法而言更适合以点为重心扩展的Prim解法。


ZOJ1586-QS Network

  题意:见Code

  题解:直接的MST题型,本题的图为稠密图,因此适合以点为扩展导向的Prim算法(代码量也较少)。

     大抵是先以某点A为中心,标记点A,访问其邻接点,更新全图到该点的距离(不通路以INF表示),找出最短距离的点B

     标记最短距离的B点,然后访问其邻接点,更新邻接点到B点的最短距离,找出最短距离的点C...以此类推...

     将已标记的点作为生成树M节点,此时M就是所求最小生成树。

     该算法的实际核心可以理解为每次更新所有未加入生成树M的点到集合M(将M理解为一个整体)的最短距离

     因此该算法普遍将该最短距离简化为一个数组,教材上一般命名为lowcost[MAX],不断更新此数组的最小值即可。

  

 //Prim-裸
//建立QS网络,一条网线需要一定成本及两点处的适配器成本,求最小费用
//本题的边数可到10^6,而点只到10^3,因此理论上说用prim比Kruskal明智(也比较好写)
//Time:30Ms Memory:4228K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; #define INF 0x3f3f3f3f
#define MAX 1005 int n;
int d[MAX][MAX];
int adapter[MAX]; //适配器价格
int lowcost[MAX]; //各点到已生成集合的最小路长
bool v[MAX]; //已访问的点 void prim()
{
memset(lowcost, INF, sizeof(lowcost));
memset(v, false, sizeof(v)); int minv = ;
v[] = true;
for (int i = ; i < n; i++)
lowcost[i] = d[i][];
for (int i = ; i < n; i++)
{
int mind = INF;
int k; //最近的结点编号
for (int j = ; j < n; j++)
{
if (!v[j] && mind > lowcost[j])
{
mind = lowcost[j];
k = j;
}
} minv += mind;
v[k] = true;
for (int j = ; j < n; 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--)
{
scanf("%d", &n);
for (int i = ; i < n; i++)
scanf("%d", &adapter[i]);
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
{
scanf("%d", &d[i][j]);
d[i][j] += adapter[i] + adapter[j];
}
prim();
}
return ;
}

POJ1789(ZOJ2158)-Truck History

  题意:由7位编码组成的卡车编码,两个编码间的距离以对应位置的编码不同个数为总距离,例如aaaaaaa,abaabaa两个编码距离为2,求使得所有卡车编码最近的距离。(与实际题意有一点不同,为了方便理解稍微改编了一些)

  题解:理解了题意就好做了,本质依然是求一个裸的MST。

     Prim算法思路参照上题题解。

 //Prim-裸
//POJ1789-ZOJ2158
//边数4*10^6,点2000,稠密图较适合Prim
//Time:657Ms Memory:15872K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; #define INF 0x3f3f3f3f
#define MAX 2001 int n;
int d[MAX][MAX];
int lowcost[MAX];
bool v[MAX];
char s[MAX][]; void prim()
{
memset(lowcost, INF, sizeof(lowcost));
memset(v, false, sizeof(v));
int minv = ;
v[] = true;
for (int i = ; i < n; i++)
lowcost[i] = d[i][];
for (int i = ; i < n; i++)
{
int mind = INF;
int k;
for (int j = ; j < n; j++)
{
if (!v[j] && mind > lowcost[j])
{
mind = lowcost[j];
k = j;
}
}
minv += mind;
v[k] = true;
for (int j = ; j < n; j++)
if (!v[j]) lowcost[j] = min(lowcost[j], d[k][j]);
}
printf("The highest possible quality is 1/%d.\n", minv);
} int main()
{
while (scanf("%d", &n), n)
{
for (int i = ; i < n; i++)
scanf("%s", s[i]);
memset(d, , sizeof(d));
for (int i = ; i < n; i++)
for (int j = i+; j < n; j++)
for (int k = ; k < ; k++)
d[j][i] = d[i][j] += s[i][k] != s[j][k];
prim();
}
return ;
}

ACM/ICPC 之 Prim范例(ZOJ1586-POJ1789(ZOJ2158))的更多相关文章

  1. ACM/ICPC 之 Kruskal范例(ZOJ1203-POJ1861(ZOJ1542))

    两道最小生成树范例,Kruskal解法-以边为主体扩展最小生成树,需要利用并查集. ZOJ1203-Swordfish 题意:求n个给定平面坐标的城市中的一条平面距离上的最短路长(保留两位小数) 题解 ...

  2. ACM/ICPC 之 Floyd范例两道(POJ2570-POJ2263)

    两道以Floyd算法为解法的范例,第二题如果数据量较大,须采用其他解法 POJ2570-Fiber Network //经典的传递闭包问题,由于只有26个公司可以采用二进制存储 //Time:141M ...

  3. ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

    两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...

  4. ACM/ICPC 之 BFS范例(ZOJ2913-ZOJ1136(POJ1465))

    通过几道经典BFS例题阐述BFS思路 ZOJ2913-Bus Pass 题意:找一个center区域,使得center到所有公交线路最短,有等距的center则输出id最小的. 题解:经典的BFS,由 ...

  5. ACM/ICPC 之 DFS范例(ZOJ2412-ZOJ1008)

    通过几道例题简单阐述一下DFS的相关题型 ZOJ2412-Farm Irrigation 直观的DFS题型,稍加变化,记录好四个方向上的通路就能够做出来 题目和接水管类似,问最少要灌溉几次,即求解最少 ...

  6. 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛

    比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...

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

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

  8. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 G. Garden Gathering

    Problem G. Garden Gathering Input file: standard input Output file: standard output Time limit: 3 se ...

  9. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 D. Delay Time

    Problem D. Delay Time Input file: standard input Output file: standard output Time limit: 1 second M ...

随机推荐

  1. MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认(转)

    Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句. 该语句用来锁定特定的行(如果有where子句,就是满足w ...

  2. 大数据架构师NoSQL建模技术

    从数据建模的角度对NoSQL家族系统做了比较简单的比较,并简要介绍几种常见建模技术. 1.前言 为了适应大数据应用场景的要求,Hadoop以及NoSQL等与传统企业平台完全不同的新兴架构迅速地崛起.而 ...

  3. ng指令之 ng-repeat 篇

    1>数据绑定     ng-repeat可以绑定数组和JSON对象数据.从下图可以看出控制器的scope()函数得到的对象与controller('ctrlName',['$scope',fun ...

  4. 父容器的flowover:hidden 必须配合父容器的宽高height width才能生效

    有时候 给父容器 加上了 flowover:hidden 这个css后, 其中的子元素为什么仍然会跑出来? 解决的根本方法就是要给 父容器 加上具体的一个宽度, 或高度. (而这个宽度和高度, 其实你 ...

  5. Dirty Markup - 在线代码美化工具

    如果你需要一个帮助你规整书写混乱的代码的工具的话,我强烈推荐给你这个在线代码美化工具 - Dirty Markup.这个在线工具能够帮助你有效的处理HTML/HTML5,CSS和javascript代 ...

  6. [译]git remote

    git remote命令让我们可以创建, 查看, 删除一个到其他仓储的连结. 下图展示了我们的本地仓储有两个remote连接, 一个是中央仓储, 一个是其他开发者的仓储. 除了使用完整的url指向他们 ...

  7. TreeSet入门详解

    看到TreeSet先从最基础的去了解他,他是一个类,他所在的位置是java.util包中. 我们可以看一看他的继承架构图: 该类实现的接口: 1TreeSet案例: TreeSet是一个有序集合,Tr ...

  8. 开发板支持wifi

    参考网址: http://wangye.org/blog/archives/845/ http://blog.csdn.net/lme525/article/details/37762519  htt ...

  9. C#获取文件/字节数组MD5值方法

    找了很多,就这个管用,有时间好好研究一番 public static string GetMD5Hash(string fileName) { try { FileStream file = new ...

  10. win7平台下React-Native Android:Unable to upload some APKs

    一.问题描述 根据网络上的Win7平台下React-native配置教程配置好开发环境的过程中,在艰难进行到react-native run-android这一步时,发现一直出现错误,截图如下: 错误 ...