HDU 1102 Kruscal算法
题目大意:
给定村庄的数量,和一个矩阵表示每个村庄到对应村庄的距离,矩阵主对角线上均为1
在给定一个数目Q,输入Q行之间已经有通道的a,b
计算还要至少修建多少长度的轨道
这道题目用Kruscal方法进行计算,先将已有路径记为0,再进行所有路径长度的排序(只计算一个下三角或一个上三角,还把主对角线去掉的那种),通过并查集相交的方法,来判断二者是否属于同一个连通分量,由小到大不断找到你选取的路径,将其加起来即可
代码如下:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 105 int mat[N][N];
int visit[N],fa[N];
struct Path{
int x,y,d;
bool operator<(const Path &m) const{
return d<m.d;
}
}path[]; int getHead(int x)
{
int a=x;
while(fa[x]!=x) x=fa[x];
fa[a]=x;
return x;
} bool Union(int x,int y)
{
int fa_x=getHead(x);
int fa_y=getHead(y);
if(fa_x==fa_y) return false;
else{
fa[fa_x]=fa_y;
return true;
}
}
void swap(int &a,int &b)
{
if(a<b){
int temp=a;
a=b;
b=temp;
}
} int main()
{
int n,Q,a,b,k,ans;
while(scanf("%d",&n)!=EOF){
for(int i=;i<N;i++) fa[i]=i;
memset(visit,,sizeof(visit));
k=,ans=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) cin>>mat[i][j];
for(int i=;i<=n;i++){
for(int j=;j<i;j++) path[k].x=i,path[k].y=j,path[k++].d=mat[i][j];
} cin>>Q;
for(int i=;i<=Q;i++){
cin>>a>>b;
swap(a,b);
path[(a-)*(a-)/+b].d=;
/*if(!visit[a]) visit[a]=1,count++;
if(!visit[b]) visit[b]=1,count++;*/
} sort(path+,path+k); /*for(int i=1;i<k;i++) cout<<path[i].d<<endl;
cout<<"count"<<count<<endl;*/
int count=;
for(int i=;i<k;i++){
if(Union(path[i].x,path[i].y)) ans+=path[i].d,count++;
if(count==n-) break;//当然这一步是为了做一个优化,让它可以提前跳出循环,
//其实不跳出循环让它一直循环结束也是成立的,只是在找到n-1条边之后,
//Union函数得到的判断均为false因为n个点都进入了同一个集合内
}
cout<<ans<<endl;
}
return ;
}
HDU 1102 Kruscal算法的更多相关文章
- HDU 1102 Constructing Roads, Prim+优先队列
题目链接:HDU 1102 Constructing Roads Constructing Roads Problem Description There are N villages, which ...
- 图论问题(2) : hdu 1102
题目转自hdu 1102,题目传送门 题目大意: 输入一个n*n的邻接矩阵,其中i行j列代表从i到j的路径的长度 然后又m条路已经帮你修好了,求最短要修多长的路才能使所有村庄连接 不难看出,这道题就是 ...
- HDU 1102 最小生成树裸题,kruskal,prim
1.HDU 1102 Constructing Roads 最小生成树 2.总结: 题意:修路,裸题 (1)kruskal //kruskal #include<iostream> ...
- (step6.1.4)hdu 1102(Constructing Roads——最小生成树)
题目大意:输入一个整数n,表示村庄的数目.在接下来的n行中,每行有n列,表示村庄i到村庄 j 的距离.(下面会结合样例说明).接着,输入一个整数q,表示已经有q条路修好. 在接下来的q行中,会给出修好 ...
- hiho 1098 最小生成树二·Kruscal算法 (最小生成树)
题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析, ...
- 最小生成树(kruscal算法)
其实kruscal算法很简单,把边从小到大排一遍,如果加入此边形成环,就不加,知道这棵树有n-1条边. 代码如下(一定要理解): #include<iostream> #include&l ...
- hihocoder#1098 : 最小生成树二·Kruscal算法
#1098 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用 ...
- Kruscal算法
Kruscal算法也是最小生成树算法,这个算法感觉起来可能更直观一点,我们要求最小生成树,我们可以依次找图中的最小权重所在的边,只要这些边不构成回路就添加,知道覆盖所有的顶点. 算法的具体过程: 1. ...
- Kruscal算法求图的最小生成树
Kruscal算法求图的最小生成树 概述 和Prim算法求图的最小生成树一样,Kruscal算法求最小生成树也用到了贪心的思想,只不过前者是贪心地选择点,后者是贪心地选择边.而且在算法的实现中,我 ...
随机推荐
- 使用VMwaver 克隆CentOS 6.9网卡配置报错
报错信息: 克隆完成之后,使用的是NAT模式,进入系统之后有IP地址也可以ping外网,但是没有ifcfg-eth0这个文件,使用setup命令配置网卡时报以下错误: 待解决-
- 降低winnt Apache服务的权限,让你的虚拟主机更安全
winnt 安装 Apache 后,在后台的服务默认是以system权限运行的(system是winnt的最高权限),这给服务器带来很大的安全隐患,最近我遇到的就是php的W8C 文件管理既然可以随意 ...
- 手把手教写devops全栈自动化工具(django2.1)
简单介绍一下自己之前写的一个全栈项目,框架用的是django2.1版本 主要对paramiko模块,salstack的API二次开发. 核心组件包括:MQ,mysql,websocket,redis, ...
- 写给技术lead的招聘指南
工作这么久,面试过的工程师不下两三百人.大部份招到的人都比靠谱当然也有失败的例子.把亲身经历总结如下: 1. 什么人一定不能招: 理解能力差: 对你提出的问题,答不对题,重复提问.面试官可以在面试当中 ...
- bat判断服务是否启动
sc query|find "tomcat6" && echo yes || echo nosc query|find "eventlog" & ...
- Android内存泄露(全自动篇)
写了可执行文件启动器Launcher.jar及一些批处理,通过它们就可以自动的以一定的时间间隔提取Hprof和进程的内存信息: 一.需要的库 可执行文件启动器:lib\Launcher.jar 注:关 ...
- Git 版本控制系统的基本使用、常用操作
以Ubuntu16.04操作系统为例(其他系统类似),主要记录常用的.基本操作: 0. 安装Git 分散型版本控制系统(CVS): sudo apt-get install git 1. 初始化本地配 ...
- SQLite_Home
SQLite教程 SQLite是一个库,实现了一个独立的软件,serverless zero-configuration.事务SQL数据库引擎.SQLite是世界上最广泛的部署SQL数据库引擎.SQL ...
- python中*号和**号的用法
1.乘法符号 2.可变长参数 当我们使用函数时,需要传入不定个数的位置参数时,就可以使用*号表示,即*args,以元组形式传入:需要传入不定个数的关键字参数时,使用**表示,即**kwargs,以字典 ...
- django URL,views,html请求顺序
进来的请求转入/hello/. Django通过在ROOT_URLCONF配置来决定根URLconf. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目 ...