题目链接: http://joyoi.org/problem/tyvj-1391 思路: 首先这需要一个推论: "给定一张无向图,若用\(k(k<n-1)\)条边构成一个生成森林(可以理解为多个互不相通的生成树),再从剩下的\(m-k\)条边中选出\(n-1-k\)条边构成改该图的最小生成树,则这\(m-k\)条边中一定包含连接两个不相连生成森林的最小边权的两点" 这个推论是由这个定理得到: "一张无向图的最小生成树一定包含边权最小的那条边",这个定理可以很容…
6201 走廊泼水节 0x60「图论」例题 描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 我们一共有N个OIER打算参加这个泼水节,同时很凑巧的是正好有N个水龙头(至于为什么,我不解释).N个水龙头之间正好有N-1条小道,并且每个水龙头都可以经过小道到达其他水龙头(这是一棵树,你应该懂的..).但是OIER门为了迎接中中的挑战,决定修建一些个道路(至于怎么修,秘密~),使得每个水龙头到每个…
[Tvvj1391]走廊泼水节 Description 给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 完全图:完全图是一个简单的无向图,其中每对不同的顶点之间都恰连有一条边相连(来自百度百科) 输入格式 本题为多组数据 第一行t,表示有t组测试数据 对于每组数据 第一行N,表示水龙头的个数(当然也是OIER的个数): 2到N行,每行三个整数X,Y,Z:表示水龙头X和水龙头Y有一条长度为Z的小道 输出格式 对于…
题目传送门 题意简化:给你一棵树,要求你加边使它成为完全图(任意两点间均有一边相连) ,满足原来的树是这个图的最小生成树.求加边的价值最小是多少. 考虑Kruskal的过程,我们每次找一条最短的,两边的集合没有并在一起的两条边. 而且有个结论:边权最小的边一定在图的最小生成树中.于是我们加的所有边一定要比原边权恰好多1,这样是最贪心的. 然后每次加边的时候一定加的是$size[x]*size[y]-1$这么多个. Code #include<cstdio> #include<algori…
这道题大致题意就是让一棵树任意两点有连边(也就是完全图),但是补完后最小生成树是一开始的那棵树,问最小加的边权之和是多少. 了解题意后,我们可以想到用Kruskal(废话),当每两个集合合并的时候,除了本身的那条边,一共还会加上\(siz_i * siz_j - 1\)条边,那么每条边的大小也就是边\(i,j\)的长度\(+1\)了,具体的可以看下代码. 代码: #include <bits/stdc++.h> using namespace std; struct node{ int l ,…
完全图就是每两个点都有直接相连的边. 模拟Kruskal算法的过程,每选择一条边加入时,他两端端点在同一个集合中就跳过,否则考虑合并两个集合,合并时需要增加的每条边的权值至少是edge[i]+1,这才使得最小生成树不会改变,记录每个集合大小统计要增加的边数,累加答案. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using na…
题目链接:CH6201 当时在海亮考试的第一题: 心得:其实一个算法是要真正理解这个思路和过程,而并不是单单知道它是用来写什么题的: 思路:n个节点有n-1条边,把这n-1条边按照权值从小到大排序,有点类似Kruskal算法的过程: 设当前扫描到边(x,y,z)时,若x,y不在同一个集合,此时应该合并Sx,Sy,此时,对于x所在集合中除x之外的点u,y所在集合中除y之外的点v,完全图中u与v之间肯定要连一条边,所以共同构成一个环,因为要保证边(x,y)一定在最小生成树中,就必须让(x,y)是连接…
题目链接 https://www.luogu.org/problemnew/show/SP338 分析 联想到不久前做过的一道题\(Full\) \(Tank\),感觉可以用优先队列做,于是写了\(dijsktra\)(非负权图不敢用\(SPFA\)了) 然后发现错了,想了挺久,发现它实际上是可以找\(dis\)更大的走以花费更少的钱,于是把\(vis\)数组和\(dis\)数组全去掉就A了 优先队列保证取出的距离是最短的,如果距离相同,那么钱数是最小的,所以第一次取出\(n\)时就是答案,跑得…
「CH6201」走廊泼水节 传送门 考虑 \(\text{Kruskal}\) 的过程以及用到一个最小生成树的性质即可. 在联通两个联通块时,我们肯定会选择最小的一条边来连接这两个联通块,那么这两个联通块之间的其他边都必须比这条边长,不然最小生成树就不唯一. 又为了让答案最小化,我们就只需要让这些其他边比当前边多 \(1\) 就好了. 参考代码: #include <algorithm> #include <cstdio> #define rg register #define f…
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4008 题目大意: 想象一下,你在KTV,想待久点,并且机器会让你唱完你歌再停.于是你选了劲歌金曲,678秒.现在你至少还剩一秒切到这首歌,而且每首歌必须唱完,现在问你你最久能待多久. 思路: 01背包,动态规划.但是01背包变式我第一次做的时候没有想到,结果误入歧途..后面会贴…