博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1546 最短网络 Agri-Net(最小生成树)
阅读量:6655 次
发布时间:2019-06-25

本文共 1515 字,大约阅读时间需要 5 分钟。

嗯...

 

题目链接:https://www.luogu.org/problemnew/show/P1546

 

首先不难看出这道题的思想是用了最小生成树,但是这道题有难点:

1.读题读不明白

2.不会读入

3.跑多了

 

针对1:

首先这道题和其他题一样,你所读入的矩阵中的每一个数字都代表着相邻两点之间的边的边权,而这个点所处的位置即可以用(i,j)来表示,然后再进行操作即可

 

针对2:

我们会发现这个N*N的矩阵是关于对角线对称的,所以我们只需要读上面一部分或者下面一部分即可(要读上面一部分读入时则特判j>i,相反则特判j<i...

 

针对3:

这里就用到了生成树的性质:n个点,n-1条边,所以在合并的时候我们定义一个k,存储合并后边的条数,每合并一次则加一,最后当k == n-1时则跳出即可

 

AC代码:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 int cnt, f[1005]; 7 8 int k, h; 9 struct node{10 int x, y, l;11 } a[110005];12 13 inline int cmp(node i, node j){14 return i.l < j.l;15 }16 17 inline int find(int x){18 if(f[x] != x)19 f[x] = find(f[x]);20 return f[x];21 }22 23 int main(){24 int n;25 int z;26 scanf("%d", &n);27 for(int i = 1; i <= n; i++){28 for(int j = 1; j <= n; j++){29 scanf("%d", &z);30 if(j > i){ //只读取上面一半有用的数据 31 a[++cnt].x = i;32 a[cnt].y = j;33 a[cnt].l = z;34 }35 }36 }37 for(int i = 1; i <= n; i++)38 f[i] = i;39 sort(a+1, a+cnt+1, cmp);40 for(int i = 1; i <= cnt; i++){41 int r1 = find(a[i].x);42 int r2 = find(a[i].y);43 if(r1 != r2){44 f[r1] = r2;45 h += a[i].l;46 k++;47 }48 if(k == n-1) break;//跳出 49 }50 printf("%d", h);51 return 0;52 }
AC代码

 

转载于:https://www.cnblogs.com/New-ljx/p/10798448.html

你可能感兴趣的文章
图片涂鸦
查看>>
Shell脚本编程之Bash特性-IO重定向-变量
查看>>
东禹鲜锅-您的饮食乐趣
查看>>
windows系统常用快捷键
查看>>
php的数据类型
查看>>
nginx编译安装
查看>>
详解JSP九个内置对象
查看>>
linux - RAID技术
查看>>
错误异常slice indices must be integers or None or have
查看>>
我的友情链接
查看>>
drbd+heartbeat+nfs
查看>>
下载各种视频的好方法
查看>>
python paramiko多线程批量修改主机账号密码
查看>>
ISE13.3的Virtex5和Virtex6的在综合时一些不同
查看>>
第7章 图的基本概念
查看>>
我的友情链接
查看>>
oracle常用字符串函数
查看>>
LNMP环境下nginx、php-fpm的配置文件讲解
查看>>
会声会影截取视频教程
查看>>
Outlook2013 设置 @me.com 、 @icloud.com
查看>>