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. Vue项目中引入ElementUI

    前提:创建好的vue项目. 1.安装ElementUI 转到项目根目录,输入命令:#cnpm install element-ui --save-dev 2.在 main.js 引入并注册 impor ...

  2. Linux --Apache服务搭建

    Apache网站服务 1.基本配置 安装 [root@localhost /]# rpm -e httpd --nodeps --卸载rpm方式安装的httpd [root@localhost qwe ...

  3. 6.Zabbix 3.0 MySQL 监控

    请查看我的有道云笔记: http://note.youdao.com/noteshare?id=94cd760a4848939d33892b7464cc0401&sub=8B6EDD27671 ...

  4. git 解决冲突方法

    转载:http://www.cnlvzi.com/index.php/Index/article/id/119 当共享一个项目后提交冲突时 git push -f 强制推送本地的替换服务端 git f ...

  5. 广义mandelbrot集,使用python的matplotlib绘制,支持放大缩小

    迭代公式的指数,使用的1+5j,这是个复数.所以是广义mandelbrot集,大家能够自行改动指数,得到其它图形.各种库安装不全的,自行想办法,能够在这个站点找到差点儿全部的python库 http: ...

  6. python:进程操作

    一.多进程应用 import socket from multiprocessing import Process def talk(conn): conn.send(b'connected') re ...

  7. OpenCV人脸识别

    import cv2 filename = 'pic.jpg' def detect(filename): face_cascade = cv2.CascadeClassifier('./haarca ...

  8. react工程目录简介

    首先我们可以看到底部一个 yarn.lock的文件,这个文件主要是项目依赖的安装包,他的一些版本号,会在这里做一些限制,这个文件不要动就好了. readme.md,这个文件其实是项目的说明文件,他里面 ...

  9. PowerShell实现英汉互译_并保存

    代码如下:(介于着色 代码在文末下载) 功能简介: 自动识别英汉输入 返回结果 对于词数小于20的会保存在当前目录下temp_table.txt词文件 大于20的会被识别为句子进行互译 不会存于词文件 ...

  10. xml或其他附件下载到客户端

    //xml Document document=DocumentHelper.createDocument(); Element root=document.addElement("root ...