[vijos1234]口袋的天空最小生成树

news/2024/6/30 10:48:39

题目链接:https://vijos.org/p/1234

白天刚刚写完prim的算法,晚上就心血来潮的打了一道最小生成树的题

虽然有题解说可以用prim做,但是这道题明显是加最小的边,感觉kruskal方便多了

但是愉快的是我竟然不是一次过,最后发现是题意理解问题,我之前读了很多遍题,还是以为n朵云不用用完,但其实是n朵云要用完并成为k个棉花糖

首先可以知道的是,k个棉花糖中有k-1个是单个的云,因为单个的云就是不要花费的,所以生成树就是在剩下的n-k+1朵云中产生,然后这n-k+1朵云最多用n-k+1-1条边连接是最优的,所以其实就是kruskal选出n-k+1-1条边的最小价值

然后就是一个裸的kruskal了,然后由于很久没打kruskal了,我竟然自作聪明的加了vis数组,然后光荣爆零,最后删去vis,只用并查集判断就瞬间a了

果然是我太弱了吗

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #define maxn 10005
 8 using namespace std;
 9 
10 struct edge{
11     int  u,v,w;
12 }e[2*maxn];
13 
14 int n,m,k,pos,tot,ans;
15 int head[maxn],fa[maxn];
16 
17 int read(){
18     int xx=0,ff=1;char ch=getchar();
19     while(ch<'0'||ch>'9'){if(ch=='-')ff=-1;ch=getchar();}
20     while(ch>='0'&&ch<='9'){xx=xx*10+ch-'0';ch=getchar();}
21     return xx*ff;
22 }
23 
24 void adde(int u,int v,int w){
25     e[++pos].u=u;
26     e[pos].v=v;e[pos].w=w;
27 }
28 
29 int comp(const void*a,const void*b){
30     return (*(struct edge*)a).w>(*(struct edge*)b).w?1:-1;
31 }
32  
33 int find_(int x){
34     if(fa[x]==x)return fa[x];
35     return fa[x]=find_(fa[x]);
36 } 
37  
38 int main(){
39     scanf("%d",&n);m=read();k=read();
40     for(int i=1;i<=m;i++){
41         int u,v,w;
42         u=read();v=read();w=read();
43         adde(u,v,w);
44     }    
45     if(k>n){
46         printf("No Answer");return 0;
47     }
48     for(int o=1;o<=n;o++)
49         fa[o]=o;
50     qsort(e,m+1,sizeof(e[0]),comp);
51     for(int i=1;i<=m;i++){
52         int u=e[i].u,v=e[i].v;
53         int fu=find_(u);int fv=find_(v);
54         if(fu!=fv){
55             fa[fu]=fv;
56             tot++;vis[fv]=1;ans+=e[i].w;
57         }
58         if(tot>=n-k+1-1){
59             printf("%d",ans);return 0;
60         }
61     }
62     printf("No Answer");
63 }
kruskal

【总结】

头可断,血可流,代码错不得

注意判断选入边的条件,理解并查集的运用,不能死记硬背

转载于:https://www.cnblogs.com/Danzel-Aria233/p/7749238.html


http://lihuaxi.xjx100.cn/news/240550.html

相关文章

2014年数字:我的人生在命令行中

by freeCodeCamp通过freeCodeCamp 2014年数字&#xff1a;我的人生在命令行中 (2014 in Numbers: My Life Behind the Command Line) For 2014, I decided to simplify my life. Rather than pursuing a variety of human experiences, as I had previously, I wanted to focu…

linux 将文件的特定行写入另一个文件

问题背景 &#xff1a;博主处理了数据集&#xff0c;一个文件是class namefocal method&#xff0c;另一个文件是test case 对 test case 进行过滤之后得到了idx文件&#xff0c;然后根据idx文件提取出了对应的class namefocal method 现在想验证一下对应序号的class namefoc…

Java读取Properties配置文件

目录1.Properties类与Properties配置文件2.Properties中的主要方法3.示例1.Properties类与Properties配置文件Properties类继承自Hashtable类并且实现了Map接口&#xff0c;使用键值对的形式来保存属性集。不过Properties的键和值都是字符串类型。2.Properties中的主要方法(1)l…

蚂蚁金服副总裁胡喜:金融科技进入2.0时代,拼的是基础技术升级

今日&#xff08;10月12日&#xff09;&#xff0c;在2017年云栖大会上&#xff0c;ATEC金融科技开放峰会在杭州云栖小镇召开。在会上的演讲中&#xff0c;蚂蚁金服副总裁、首席技术架构师胡喜表示&#xff0c;与金融科技1.0阶段提供更为高效的便捷的普惠能力相比&#xff0c;金…

javascript回调函数笔记

来源于&#xff1a;https://github.com/useaname/blog-study 在Javascript中&#xff0c;函数是第一类对象。意味函数可以像对象一样按照第一类被管理使用。回调函数是从一个叫函数式编程的编程范式中衍生出来的概念。简单来说&#xff0c;函数式编程就是使用函数作为变量。函数…

网页制作_网页

网页制作by Divya Mistry通过Divya Mistry 网页 (MePage) Web上的单页目标 (A Single-page Destination on the Web) After going through some front-end development tutorials on Free Code Camp, I decided to try my hands at this simple Zipline challenge of creating…

写了一个linux的计时脚本,能够输出时分秒

#!/bin/bashstart$(date %s)# 用需要计时的程序将下面这句替换掉 sleep 100;end$(date %s) take$(( end - start )) echo Time taken to execute commands is ${take} seconds.let min${take}/60 let left1${take}-$(( ${min} * 60 ))echo That is ${min} minutes and ${left1}…

gulp

详情请参见github: https://github.com/Sunnshino/gulpjs-plugs 1 /*2 目录结构:3 test(主目录)4 src(输入路径)5 index.html(主页面)6 js(文件夹)7 less(文件夹)8 images(文件夹)9 …