Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 26694   Accepted: 11720

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

题意:题意十分简单粗暴,首行给出N,接着是个N*N的矩阵,map[i][j]就代表i到j的权值。接着给出Q,下面Q行,每行两个数字A,B,代表A到B,B到A的权值为0。最后输出最小生成树的权值和就行。

思路:由于是稠密图,所以选用普利姆算法比较合适,
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define N 110
#define M 0x3f3f3f3f//用一个大值表示两点不通 int map[N][N];
int vis[N],dst[N];//vis标已加入MST的点,dst存放各点到MST的最小距离
int n,q; void init()//初始图
{
int i,j; for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
{
i==j?map[i][j]=0:map[i][j]=M;//自己到自己的点距离为0
}
}
memset(vis,0,sizeof(vis));
memset(dst,0,sizeof(dst));
} void prime()
{
int ans=0,i,min,j,k,point; vis[1]=1;//1放入MST
for (i=1;i<=n;i++)
{
dst[i]=map[i][1];//dst初始化
} for (i=1;i<=n;i++)
{
min=M;
for (j=1;j<=n;j++)//找距MST最近的点
{
if (vis[j]==0&&min>dst[j])
{
min=dst[j];
point=j;
}
}
if (min==M)//没有连通点
{
break;
} vis[point]=1;//把距MST最近的点加入MST
ans=ans+dst[point]; for (k=1;k<=n;k++)//更新各点到MST的最小距离
{
if (vis[k]==0&&dst[k]>map[k][point])
{
dst[k]=map[k][point];
}
}
}
printf("%d\n",ans);
} int main()
{
int i,j,x,y; scanf("%d",&n);
init();
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
}
} scanf("%d",&q);
for (i=0;i<q;i++)
{
scanf("%d%d",&x,&y);//已连通的两点权为0
map[x][y]=0;
map[y][x]=0;
} prime(); return 0;
}

POJ-2421-Constructing Roads(最小生成树 普利姆)的更多相关文章

  1. POJ 2421 Constructing Roads (最小生成树)

    Constructing Roads Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  2. POJ - 2421 Constructing Roads (最小生成树)

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...

  3. 最小生成树-普利姆(Prim)算法

    最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...

  4. 最小生成树-普利姆算法lazy实现

    算法描述 lazy普利姆算法的步骤: 1.从源点s出发,遍历它的邻接表s.Adj,将所有邻接的边(crossing edges)加入优先队列Q: 2.从Q出队最轻边,将此边加入MST. 3.考察此边的 ...

  5. 图论---最小生成树----普利姆(Prim)算法

    普利姆(Prim)算法 1. 最小生成树(又名:最小权重生成树) 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一 ...

  6. 最小生成树-普利姆算法eager实现

    算法描述 在普利姆算法的lazy实现中,参考:普利姆算法的lazy实现 我们现在来考虑这样一个问题: 我们将所有的边都加入了优先队列,但事实上,我们真的需要所有的边吗? 我们再回到普利姆算法的lazy ...

  7. POJ 2421 Constructing Roads (最小生成树)

    Constructing Roads 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/D Description There ar ...

  8. POJ - 2421 Constructing Roads 【最小生成树Kruscal】

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

  9. POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )

    Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19884   Accepted: 83 ...

随机推荐

  1. 随tomcat启动的Servlet程序

    由于需要做一定定时轮询程序,自己写了一个Servlet小程序,在Servlet里面的Init函数中做一个Timer,定时执行程序. 代码如下: public class MailStartup  ex ...

  2. The Tao to Excellent 2

    就算自己现在的技术水平很菜,就算自己现在写的代码还是很烂,但我们还是要一直坚持在最前线,一直向上,也许,在前方,就有不一样的风景在等着我们. 因为我深深明白到一件事:人之所以选择混吃等死,是因为他们根 ...

  3. fiddler和charles

    (4)学习浏览器代理和手机网络抓包,涉及到了fiddler和charles,

  4. Android(java)学习笔记23:finally关键字的作用

    1. finally 关键字的作用 package cn.itcast_07; import java.text.ParseException; import java.text.SimpleDate ...

  5. BZOJ2836:[SHOI2012]魔法树(树链剖分)

    Description Input Output Sample Input 4 0 1 1 2 2 3 4 Add 1 3 1 Query 0 Query 1 Query 2 Sample Outpu ...

  6. 动态规划(DP),类似LIS,FatMouse's Speed

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weig ...

  7. 2018.11.25 struts2与OGNL表达式的结合(高级)

    两者的结合原理 底层源码分析 栈原理 先进后出 我们的valuestack其实是一个接口 在实现类中有这个参数 CompoundRoot的类继承的是ArrayList,具体实现弹栈和压栈的方法具体实现 ...

  8. vue快速使用

    1.引用脚本 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script ...

  9. Hive中使用LZO

    hive 中使用lzo 1 启动hive 错误Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...

  10. LINQ to XML简介

    我们的配置文件使用XML存储信息.ADO.NET的DataSet(利用扩展方法)可以方便的将数据保存(或加载)为XML..NET特有的XML API,如XmlReader/XmlWriter类.微端提 ...