hdoj1102 Constructing Roads(Prime || Kruskal)
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1102
题意
有n个村庄(编号1~n),给出n个村庄之间的距离,开始时n个村庄之间已经有了q条路,现在需要修一条路,这条路连接起所有的村庄,求在已经存在的路径的基础上,最少还需要修多长的路。
思路
普通最小生成树是从零开始构造一棵最小生成树,而这题开始时图中已经有了一些路径,那这些路就不需要被修了,所以将这些路的修理长度置为0,然后使用Prime算法或者Kruskal算法求解即可。
代码
Prime算法:
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std; const int INF = 0x7fffffff;
const int N = + ;
int map[N][N];
int dist[N]; //记录从起点到其余各点的长度,不断更新
int n, q; void prime()
{
int min_edge, min_node;
for (int i = ; i <= n; i++)
dist[i] = INF;
int ans = ;
int now = ;
for (int i = ; i < n;i++)
{
min_edge = INF;
dist[now] = -;
for (int j = ; j <= n; j++)
{
if (j != now && dist[j] >= )
{
if (map[now][j] >= ) //注意是map[now][j]>=0,因为有些路已经修好了,初始化时令其长度为0
dist[j] = min(dist[j], map[now][j]);
if (dist[j] < min_edge)
{
min_edge = dist[j]; //min_edge存储与当前结点相连的最短的边
min_node = j;
}
}
}
ans += min_edge; //ans存储最小生成树的长度
now = min_node;
}
printf("%d\n", ans);
} int main()
{
//freopen("hdoj1102.txt", "r", stdin);
while (scanf("%d", &n) == )
{
memset(map, , sizeof(map));
for (int i = ; i <= n;i++)
for (int j = ; j <= n; j++)
scanf("%d", &map[i][j]);
scanf("%d", &q);
int a, b;
for (int i = ; i < q; i++)
{
scanf("%d%d", &a, &b);
map[a][b] = map[b][a] = ;
}
prime();
}
return ;
}
Kruskal算法:
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std; struct Edge
{
int a, b, dist; Edge() {}
Edge(int a, int b, int d) :a(a), b(b), dist(d) {}
bool operator < (Edge edge) //将边按边长从短到长排序
{
return dist < edge.dist;
}
}; const int N = + ;
int p[N]; //并查集使用
int map[N][N];
vector<Edge> v;
int n, q; int find_root(int x)
{
if (p[x] == -)
return x;
else return find_root(p[x]);
} void kruskal()
{
memset(p, -, sizeof(p));
sort(v.begin(), v.end());
int ans = ;
for (int i = ; i < v.size(); i++)
{
int ra = find_root(v[i].a);
int rb = find_root(v[i].b);
if (ra != rb)
{
ans += v[i].dist;
p[ra] = rb;
}
}
printf("%d\n", ans);
} int main()
{
//freopen("hdoj1102.txt", "r", stdin);
while (scanf("%d", &n) == )
{
v.clear();
int t;
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
scanf("%d", &map[i][j]);
scanf("%d", &q);
int a, b;
for (int i = ; i < q; i++)
{
scanf("%d%d", &a, &b);
map[a][b] = map[b][a] = ;
} for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
if (j > i) v.push_back(Edge(i, j, map[i][j])); kruskal();
}
return ;
}
注意点
这题是有多组输入数据的,如果只按一组输入数据处理的话会WA.
hdoj1102 Constructing Roads(Prime || Kruskal)的更多相关文章
- poj1251 Jungle Roads(Prime || Kruskal)
题目链接 http://poj.org/problem?id=1251 题意 有n个村庄,村庄之间有道路连接,求一条最短的路径能够连接起所有村庄,输出这条最短路径的长度. 思路 最小生成树问题,使用普 ...
- hdu 1102 Constructing Roads (Prim算法)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Jav ...
- hdoj1879 继续畅通工程(Prime || Kruskal)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1879 思路 这题和hdoj1102很像,图中的有一些路已经修好了,对于这些已经修好的路,我们令还需要修 ...
- poj1258 Agri-Net(Prime || Kruskal)
题目链接 http://poj.org/problem?id=1258 题意 有n个农场,现在要在n个农场之间铺设光纤使得n个农场连接起来,求铺设光纤的最短距离. 思路 最小生成树问题,使用Prime ...
- hdoj1863 畅通工程(Prime || Kruskal)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1863 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决.这题在hdoj1233的基础 ...
- hdoj1233 还是畅通工程(Prime || Kruskal)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决. 代码 Prime算法: # ...
- Constructing Roads----poj2421(最小生成树Kruskal)
题目链接: http://poj.org/problem?id=2421 想把n个村庄连接在一起:求最小生成树,不同的是已经有了m条线段链接在一起了,求剩下的: 感觉用Kruskal会简单一点 #in ...
- POJ 2421 Constructing Roads (最小生成树)
Constructing Roads 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/D Description There ar ...
- Constructing Roads(1102 最小生成树 prim)
Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- 在升级Windows 8.1后,桌面的右下角显示"SecureBoot未正确配置"
原地址为:http://ask.zol.com.cn/q/201881.html 第一种模式BIOS: 在将Secure Boot设置为Enabled后,Secure Boot Status依然为关闭 ...
- COGS 栅格网络流
750. 栅格网络流 http://www.cogs.pro/cogs/problem/problem.php?pid=750 ★★☆ 输入文件:flowa.in 输出文件:flowa.out ...
- Android的音频解码原来是直接调用的本地C方法直接通过硬件解码
Android就是披着JAVA外衣的C啊~音频解码原来是直接调用的本地C方法直接通过硬件解码的,JAVA和C的字节数组存放模式不同(java是大端,C根据不同平台不同),不同格式需要转化以后才能用. ...
- 程序员 & 设计师都能用上的 75 份速查手册
分享75份开发人员和设计师会用到的速查手册,由 vikas 收集整理,包括:jQuery.HTML.HTML5.CSS.CSS3.JavaScript.Photoshop .git.Linux.Jav ...
- Asp.net 中,在服务端向客户端写脚本的常用方法
在Asp.net 服务端处理脚本,一般都用 ClientScriptManager ,即web窗体服务端的this.ClientScript.该对象比较常用的方法: 1.RegisterArrayDe ...
- STL-pair
每个pair 可以存储两个值.这两种值无限制. 定义 pair<int,char> p; pair<string,int> p; pair<int,int> p; ...
- 【译】第七篇 SQL Server代理作业活动监视器
本篇文章是SQL Server代理系列的第七篇,详细内容请参考原文 在这一系列的上一篇,你创建并配置SQL Server代理作业.每个作业有一个或多个步骤,可能包含大量的工作流.在这篇文章中,将查看作 ...
- 在Linode VPS上搭建最新版Transmission
在Linode VPS上搭建最新版Transmission 2015-09-16 by Hansen 原文链接:http://www.hansendong.me/archives/124.html 以 ...
- MySQL5.7之多源复制&Nginx中间件(下)【转】
有生之年系列----MySQL5.7之多源复制&Nginx中间件(下)-wangwenan6-ITPUB博客http://blog.itpub.net/29510932/viewspace-1 ...
- easyui表单提交验证form
方式一,不需要考虑jquery.easyui.min.js版本 <script> $(function () { //针对 设置 novalidate:true $('.validateb ...