Constructing Roads

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5227    Accepted Submission(s): 1896

Problem Description
There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B, or there exists a village C such that there is a road between A and C, and C and B are connected.

We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.

 
Input
The first line is an integer N (3 <= N <= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 1000]) between village i and village j.

Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.

 
Output
You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum. 
 
Sample Input

3 0 990 692 990 0 179 692 179 0 1 1 2
 
Sample Output

179
 

很简单的最小生成树,有两种做法,我采用Kruskal和Prim都试了一下。一种是使已经有的边距离为0,这样既能顺利地生成,又能不影响答案;第二种是合并已经有的两条边的集合。我这里kruskal采用的是第二种方法,Prim只能用第一种方法。

Kruskal Algorithm Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 107 int mp[N][N],fa[N],vis[N][N],n,res; struct Edge
{
int s,t,w;
}edge[N*N]; int cmp(Edge ka,Edge kb)
{
return ka.w < kb.w;
} int findset(int x)
{
if(x != fa[x])
fa[x] = findset(fa[x]);
return fa[x];
} void Kruskal()
{
int i,j,k = ,q,A,B;
for(i=;i<=n;i++)
{
for(j=i+;j<=n;j++)
{
edge[k].s = i;
edge[k].t = j;
edge[k].w = mp[i][j];
k++;
}
}
sort(edge,edge+k,cmp);
for(i=;i<=n;i++)
fa[i] = i;
res = ;
scanf("%d",&q);
for(i=;i<q;i++)
{
scanf("%d%d",&A,&B);
int u = findset(A);
int v = findset(B);
fa[u] = v;
}
for(i=;i<k;i++)
{
int u = edge[i].s;
int v = edge[i].t;
int fx = findset(u);
int fy = findset(v);
if(fx != fy)
{
res += edge[i].w;
fa[fx] =fy;
}
}
} int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=;i<=n;i++)
for(j=;j<=n;j++)
scanf("%d",&mp[i][j]);
Kruskal();
printf("%d\n",res);
}
return ;
}

Prim Algorithm Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
using namespace std;
#define N 107 int mp[N][N],vis[N],n,res,len[N]; void Prim()
{
int i,j,k,mini;
res = ;
memset(vis,,sizeof(vis));
for(i=;i<=n;i++)
len[i] = mp[][i];
len[] = ;
vis[] = ;
for(i=;i<=n;i++)
{
mini = Mod;
for(j=;j<=n;j++)
{
if(!vis[j] && len[j] < mini)
{
mini = len[j];
k = j;
}
}
if(mini == Mod)
return;
res += len[k];
vis[k] = ;
for(j=;j<=n;j++)
{
if(!vis[j] && len[j] > mp[k][j])
len[j] = mp[k][j];
}
}
}
int main()
{
int i,j,q,u,v;
while(scanf("%d",&n)!=EOF)
{
for(i=;i<=n;i++)
for(j=;j<=n;j++)
scanf("%d",&mp[i][j]);
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&u,&v);
mp[u][v] = mp[v][u] = ;
}
Prim();
printf("%d\n",res);
}
return ;
}

HDU 1102 Constructing Roads的更多相关文章

  1. HDU 1102 Constructing Roads, Prim+优先队列

    题目链接:HDU 1102 Constructing Roads Constructing Roads Problem Description There are N villages, which ...

  2. HDU 1102(Constructing Roads)(最小生成树之prim算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Ja ...

  3. hdu 1102 Constructing Roads (Prim算法)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Jav ...

  4. hdu 1102 Constructing Roads (最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Jav ...

  5. HDU 1102 Constructing Roads (最小生成树)

    最小生成树模板(嗯……在kuangbin模板里面抄的……) 最小生成树(prim) /** Prim求MST * 耗费矩阵cost[][],标号从0开始,0~n-1 * 返回最小生成树的权值,返回-1 ...

  6. hdu 1102 Constructing Roads Kruscal

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 题意:这道题实际上和hdu 1242 Rescue 非常相似,改变了输入方式之后, 本题实际上更 ...

  7. HDU 1102 Constructing Roads(kruskal)

    Constructing Roads There are N villages, which are numbered from 1 to N, and you should build some r ...

  8. hdu 1102 Constructing Roads(最小生成树 Prim)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Problem Description There are N villages, which ...

  9. HDU 1102 Constructing Roads(最小生成树,基础题)

    注意标号要减一才为下标,还有已建设的路长可置为0 题目 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<str ...

随机推荐

  1. PHP的静态变量和引用函数

    直接贴代码,结果的原因写在备注了 <?php /** * Created by PhpStorm. * User: Administrator * Date: 16-8-25 * Time: 上 ...

  2. spring中常用工具类介绍

    http://www.cnblogs.com/langtianya/p/3875103.html 文件资源操作     Spring 定义了一个 org.springframework.core.io ...

  3. Android笔记——什么是json?json如何使用?

    什么是json 什么是json,json是什么,json如何使用 JSON是JavaScript Object Notation的缩写,可见JSON来源于JavaScript.JSON数据是一系列键值 ...

  4. Office版本问题0x80029C4A

    说来奇怪,以前运行正常的程序(涉及excel表格输出),现在运行失败了,一调试,发现了如下问题: 无法将类型为"Microsoft.Office.Interop.Excel.Applicat ...

  5. iOS加载程序视图的方式

    The UIViewController class provides built-in support for loading a view controller's views whenever ...

  6. iOS应用程序开发之应用间的跳转(用着微信等第三方分享登陆)

    简介 配置和实现 判断应用启动方式 一.简介 最实际项目开发中,我们难免会遇到需要从一个应用跳转到另一个应用的情况.比如微信分享,实际就是一种应用间的跳转.但是有时候我们需要实现自己的两个应用间的跳转 ...

  7. iOS 验证邮箱手机号格式

    做登录界面时,用户在UITextfield中输入输入邮箱账号后,我们应该在本地验证格式是否正确,再将参数传给服务器验证. 最简单的就是利用系统的NSPredicate //利用正则表达式验证 -(BO ...

  8. Android线程管理(二)——ActivityThread

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  9. 关于OC中直接打印结构体,点(CGRect,CGSize,CGPoint,UIOffset)等数据类型

    关于OC直接打印结构体,点(CGRect,CGSize,CGPoint,UIOffset)等数据类型,我们完全可以把其转换为OC对象来进项打印调试,而不必对结构体中的成员变量进行打印.就好比我们可以使 ...

  10. 邮件群发工具(C#版)

    引言 经常会参与组织一些社区活动,涉及到和不同的人进行交流,微信当然是必须的,同样邮件也是一种不可或缺的方式. 一般群发的邮件不是很友好,如果是一对一的,收到邮件的人是不是会比较重视,而且还有他的名字 ...