题目大意:
给定村庄的数量,和一个矩阵表示每个村庄到对应村庄的距离,矩阵主对角线上均为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算法的更多相关文章

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

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

  2. 图论问题(2) : hdu 1102

    题目转自hdu 1102,题目传送门 题目大意: 输入一个n*n的邻接矩阵,其中i行j列代表从i到j的路径的长度 然后又m条路已经帮你修好了,求最短要修多长的路才能使所有村庄连接 不难看出,这道题就是 ...

  3. HDU 1102 最小生成树裸题,kruskal,prim

    1.HDU  1102  Constructing Roads    最小生成树 2.总结: 题意:修路,裸题 (1)kruskal //kruskal #include<iostream> ...

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

    题目大意:输入一个整数n,表示村庄的数目.在接下来的n行中,每行有n列,表示村庄i到村庄 j 的距离.(下面会结合样例说明).接着,输入一个整数q,表示已经有q条路修好. 在接下来的q行中,会给出修好 ...

  5. hiho 1098 最小生成树二·Kruscal算法 (最小生成树)

    题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析, ...

  6. 最小生成树(kruscal算法)

    其实kruscal算法很简单,把边从小到大排一遍,如果加入此边形成环,就不加,知道这棵树有n-1条边. 代码如下(一定要理解): #include<iostream> #include&l ...

  7. hihocoder#1098 : 最小生成树二·Kruscal算法

    #1098 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用 ...

  8. Kruscal算法

    Kruscal算法也是最小生成树算法,这个算法感觉起来可能更直观一点,我们要求最小生成树,我们可以依次找图中的最小权重所在的边,只要这些边不构成回路就添加,知道覆盖所有的顶点. 算法的具体过程: 1. ...

  9. Kruscal算法求图的最小生成树

    Kruscal算法求图的最小生成树 概述   和Prim算法求图的最小生成树一样,Kruscal算法求最小生成树也用到了贪心的思想,只不过前者是贪心地选择点,后者是贪心地选择边.而且在算法的实现中,我 ...

随机推荐

  1. Spring------自动化装配Bean(二)

    上一篇是基于 @ComponentScan自动装配Bean的实现,这一篇将通过java手动装配bean来实现. 手动装配相对于自动装配的优点: 可以自行定义Bean的各个属性. 添加额外的方法调度. ...

  2. Ajax深入理解

    Ajax  Asynchronous JavaScript and XML 异步的JavaScript和XML ajax通过与后台服务器进行少量的数据交换,ajax可以使页面实现异步更新,即不需要重新 ...

  3. 激活eclipse自动提示功能

    eclipse设置: Window->Preferences->Java->Editor->Content Assist

  4. jq获取设置选中值

    var standard = $('input[name="standard"]:checked').val(); $("input[name='advertByid'] ...

  5. mac上的应用提权

    一个mac上的app需要在/Applications/My.app/Contents/MacOS路径下创建一个配置文件,在开启root权限的账户下运行时ok,但是在没有开启root权限的账户下运行时, ...

  6. 洛谷 P2319 [HNOI2006]超级英雄

    题目描述 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一 ...

  7. 洛谷 P1618 三连击(升级版)

    题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”. //感谢黄小U饮品完善题意 输入输出格 ...

  8. HDU 5768Lucky7(多校第四场)容斥+中国剩余定理(扩展欧几里德求逆元的)+快速乘法

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Time Limit: 2000/1000 MS (Java/Others)    M ...

  9. execve - 执行程序

    总览 (SYNOPSIS) #include <unistd.h> int execve (const char *filename, char *const argv [], char ...

  10. 部署 k8s Cluster(上)[转]

    我们将部署三个节点的 Kubernetes Cluster. k8s-master 是 Master,k8s-node1 和 k8s-node2 是 Node. 所有节点的操作系统均为 Ubuntu ...