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算法求最小生成树也用到了贪心的思想,只不过前者是贪心地选择点,后者是贪心地选择边.而且在算法的实现中,我 ...
随机推荐
- Saltstack学习笔记--安装
实验环境: 两台RHEL 7.2 192.168.75.135 master .minion 192.168.75.136 minion 确保机器的防火墙及seli ...
- C++ thread operator= 右值引用 vector foreach
这是 thread 的construct定义: default (1) thread() noexcept; initialization (2) template <class Fn, cla ...
- android开发学习 ------- 【转】Genymotion 小白安装
参考 https://www.cnblogs.com/whycxb/p/6850454.html 很详细,全面
- python实战之爬取喜玛拉雅专辑信息
import urllib.request import json from lxml import etree url='http://www.ximalaya.com/dq/8.ajax' hea ...
- iOS面试题之runloop
本文围绕以下几个部分展开对runloop的叙述. 1.runloop是什么/runloop的概念? 2.NSRunLoop 和 CFRunLoopRef? 3.runloop和线程的关系? 4.run ...
- AJPFX关于Java内部类及其实例化
public class Outer { private int size; public class Inner { private int counter = 10; ...
- 备忘录模式及php实现
备忘录模式: 又叫做快照模式或Token模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 角色: 1.创建者:负责创建一个备忘 ...
- ES之基本数据类型之间的显示转换和隐式转换
typeof(数据)/ typeof 数据 判断数据的数据类型,typeof返回的都是字符串 输出结果类型有:number.string.boolean. undefined.object.funct ...
- Synplify FPGA 逻辑综合
作为 Synopsys FPGA 设计解决方案的一部分,Synplify FPGA 综合软件是实现高性能.高性价比的 FPGA 设计的行业标准. 其独特的行为提取综合技术 (Behavior Extr ...
- 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space
昨天在项目中需要对日志的查询结果进行导出功能. 日志导出功能的实现是这样的,输入查询条件,然后对查询结果进行导出.由于日志数据量比较大.多的时候,有上亿条记录. 之前的解决方案都是多次查询,然后使用l ...