#include<stdio.h> #include<string.h> #define inf 999999999 #define N 1100 struct node { int u,v,w; }edge[11000]; int visit[N],dis[N],id[N],pre[N],yong,n,index; void addedge(int u,int v,int w){ edge[yong].u=u; edge[yong].v=v; edge[yong++].w=w;…
HDU - 2121 :http://acm.hdu.edu.cn/showproblem.php?pid=2121 比较好的朱刘算法blog:https://blog.csdn.net/txl199106/article/details/62045479 题意: 在一个有向图中,找一个点,使得这个点到其他点的距离和最小,输出距离和,和这个点的坐标. 思路: 无根最小树形图,设所有的有向图的距离和为sum.自己建立一个虚拟的原点(n+1),向每一个节点连一条距离为sum+1的边.以n+1为根结点…
hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树形图算法,这时肯定存在解,如果费用>=inf时,说明无解.这是因为sigma(cost_edge)<inf.如何求得根?在寻找前驱时发现为根,则更新一下那条边的边号即可. hdu 4009 题目:n个地方需要供水,可以自己挖水井供给自己,或者可以从别的地方供水,给出各自的方案,问对n个城市供水的最…
[解题思路]这题先看了NotOnlySuccess的解题思路,即设置虚根再处理的做法:弄了一个上午,再次有种赶脚的感觉~~如果需要找出为什么需要去比所有权值之和更大的数为新增的虚边的话,一开始我理解仅是找比最大边权值要大的数就够了,因为这样就已经满足了不会提前找到虚边的情况,但如果是这样的话那就很难判断这样一种情况:生成的最小树形图(含虚根)有两条边是从虚根出来的. #include<cstdio> #include<cstring> #define SIZE 1002 #defi…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目大意: 有n个点,有m条单向路,问这n个点组成最小树形图的最小花费. 解题思路: 1:构造虚根最小树形图 因为是不定根,所以我们可以假设一个虚拟根,分别与n个点都有一条权值为r的虚边,假如我们把r设的非常大的话,我们求出来的最小数形图去掉虚点和虚边就是最小树形图了,如果去掉虚点和虚边图形变得不连通了,那么说明这n个点不存在最小树形图,因为r非常大,并且不存在任何一条边替换掉r,使得图形连…
分析:建一个远点,往每个点连建井的价值(单向边),其它输水线按照题意建单向边 然后以源点为根的权值最小的有向树就是答案,套最小树形图模板 #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <stack> #include <…
n个技能,每个技能有0-a[i]的等级,m个课程,每个课程需要前置技能c[i]至少达到lv1[i]等级,效果是技能d[i]达到lv2[i]等级,花费w[i]. 输出最小花费使得全技能满级(初始全技能0等级) n<=50,Σa[i]<=500,m<=2000 点<=551,边<=2000+50+Σ((a[i]+1)*a[i]/2) Σw[i]<=2000*1000<0x3f3f3f3f 比赛时候完全不在状态,什么题都想不到,坑队友了... 最小树形图-做过tarja…
Golden Eggs Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 501    Accepted Submission(s): 281 Problem Description There is a grid with N rows and M columns. In each cell you can choose to put…
朱刘算法求无根最小树形图 可以任意选一个根,求最小的权和以及当时的根. 先建一个超级根,它连向所有点,边权为所有边的边权和加1(即sumw+1),然后求以它为根的最小树形图,再根据树形图权和与2*(sumw+1)的关系判断是否存在解(如果大于等于就不存在,否则存在). 至于求对应的原图中的根,我们发现自始自终,超级根都不可能在一个环中,并且在最有一个状态,一定是一个没有环的树形图,该图中与前趋为超级根的点,就是原图中的根所在的环缩成的点,怎么得到具体是哪一个点呢,我们可以记下那条边在最开始指向的…
题目链接: 题目 Ice_cream's world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) 问题描述 After awarded lands to ACMers, the queen want to choose a city be her capital. This is an important event in ice_cream world, and it a…
第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一个环,如果还要维护处树的特点 那么就要在这个环上删去一条边,这样他还是树,删掉的边显然是这条链上权值最大边更可能形成次小生成树.那么就有2中方法可以做. 第一种PRIM在prim时候直接可以做出这个从I到J的链上权值最大的值MAX[i][j]; 同时可以用kruskal同样方式标记树边,然后DFS跑…
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2121 题意:n个顶点,m条边,求从某一点起建立有向图最小生成树而且花费最小.输出最小花费和根节点下标. 思路:这道题根是不确定的,我们能够先如果一个根.从这个根出发到不论什么一点的距离(sum)都比原图总权值还大.这样保证了虚拟的边不会是最小入边,也为之后推断是否生成了最小树形图提供方便,从这个点開始建立最小树形图,最后生成出一个结果.非常显然虚拟的根仅仅有一条出边.而且出边连接的点就是真实的根. 最…
目录 List Bzoj 2260 商店购物 Description Input Output Sample Input Sample Output Bzoj 4349 最小树形图 Description Input Output Sample Input Sample Output CJ-test Solution Notice: Code Position: http://www.lydsy.com/JudgeOnline/problem.php?id=2260 http://www.lyd…
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) [Problem Description] After awarded lands to ACMers, the queen want to choose a city be her capital. This is an important event in…
Ice_cream’s world II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2121 Description After awarded lands to ACMers, the queen want to choose a city be her capital. This is an important event in…
这个题就是需要求整个有向带权图的最小树形图,没有指定根,那就需要加一个虚根 这个虚根到每个点的权值是总权值+1,然后就可以求了,如果求出来的权值大于等于二倍的总权值,就无解 有解的情况,还需要输出最根,多解的情况,肯定是某个环上所有的点为根都可以(比如所有的点构成一个环), 这样加边的时候虚边的时候按照点的标号从小到大编,这样第一个以虚根为前驱的点也是最小的点就可以标记(标记一下) #include <iostream> #include <algorithm> #include…
题目链接 题意 求有向图的最小生成树,且根不定. 思路 最小树形图即求有向图的最小生成树,用的是朱刘算法. 这里不定根,那么可以建立一个虚根,让虚根和所有点相连,权值为一个很大的数(这里直接设为所有边之和+1). 如果最后的答案比两倍的sum还大,就说明至少有两个点是通过虚边(从虚点走出去的边)相连(因为虚边的边权很大),那么这也是一个不连通的图. 找真正的根的话,只要找和虚根相连并且走过虚边的点就是了. #include <bits/stdc++.h> using namespace std…
#include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考,我们引入一个虚拟点,把所有自己挖井的都连到这个点, 边权为挖井的花费,而如果i能从j处引水,则从j向i连边,边权为引水的花费, 然后对这个有向图,以虚拟点为根,求最小树形图即可(最小树形图即为有向图的最小生成树).*/ #include<string.h> #include<math.h&g…
http://acm.hdu.edu.cn/showproblem.php?pid=6141 题意: 求最大树形图. 思路: 把边的权值变为负值,那么这就是个最小树形图了,直接套模板就可以解决. 有个问题就是n结点的父亲结点的编号要尽量小,这里有个技巧可以用,权值编码,将所有边的权值都放大1000倍,对于和n相连的边,每条边在减去(n-u)的权值.这样就会去优先考虑编号小的边,而且因为权值最大为100,所以扩大1000是不会影响结果的. #include<iostream> #include&…
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6141 [题目大意] 给出一个有向图,求1点为根的最小树形图使得第n个点的直接父亲编号最小 [题解] 如果没有第n个点直接父亲编号最小的要求, 那么只要跑一遍朱刘算法即可,考虑到直接父亲最小的条件, 我们连向第n个点的所有边进行加权操作, 使得其在总边权相同的情况选取答案具有优先性 [代码] #include <cstdio> #include <algorithm> using n…
比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是所有入边中最小的. //现在所有的最小 入边都选择出来了,如果这个入边集不存在有向环的话,我们 //可以证明这个集合就是该图的最小树形图.这个证明并不是很难.如果存在有向 //环的话,我们就要将这 个有向环所称一个人工顶点,同时改变图中边的权.假 //设某点u在该环上,并设这个环中指向u的边权是in…
思路:唯一一个值得一提的就是建一个0号根节点,往每个房子建一条边,权值为房子的高度乘以X. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define Maxn 1010 #define Maxm Maxn*Maxn #define inf 100000000 using namespace std; int h…
Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3414    Accepted Submission(s): 1494 Problem Description After a day, ALPCs finally complete their ultimate intelligence syste…
无定根的最小树形图,像网络流的超级源和超级汇一样加一个起点,用邻接表(n>1000) n<1000用邻接矩阵 #include<map> #include<set> #include<ctime> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<iomanip&…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意:给出一个村庄(x,y,z).每个村庄可以挖井或者修建水渠从其他村庄得到水.挖井有一个代价,修水渠有一个代价.另外A村庄只能向其指定的一些村庄供水.使得所有村庄有水求最小代价. 思路:增加虚拟点0,向所有点连边表示挖井.能连边的连边.求最小树形图即可. struct point { int x,y,z; }; struct edge { int u,v,w; }; point p[N];…
/* 最小树形图的第二题,终于有了一些理解 具体看注释 */ /* 无定根的最小树形图 建立虚root 每次只找最短的那条入边 最小树形图理解: 第一步:寻找最短弧集E:扫一遍所有的边,找到每个点权值最小的入边,这一步会产生环 第二步:对每个点 i 找环:通过第一步记录的前驱找环,如果找到了原点或退到了另一个环,点i找环失败 第三步:缩点,缩点就是染色,把每个环内的点染上同一种颜色,每个环内点打上同一个id 第四步:更新一次边集:如果一条边连接两个不同颜色的点,就该边这条边的权值 重复以上四步.…
Ice_cream’s world II http://acm.hdu.edu.cn/showproblem.php?pid=2121 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description After awarded lands to ACMers, the queen want to choose a city be her capital.…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5832    Accepted Submission(s): 1493 Problem Description After awarded la…
这题比HDU4009要难一些.做了4009,大概知道了最小树形图的解法.拿到这题,最直接的想法是暴力.n个点试过去,每个都拿来做一次根.最后WA了,估计是超时了.(很多题都是TLE说成WA,用了G++才知道是TLE,不断修改代码也看不出来错哪了). 网上的正解是添加一个虚拟根(树根),使得它与n个点都有边相连.HDU4009题这样得到的边有实际的意义,好理解.这题这样得到的边不好理解,并且边权应该是多少也有讲究.别人的解题报告中是把这些边的权值设为原本所有边的权值之和加1.这样做的目的,是为了完…
[题意] 你需要花费不超过cost元来搭建一个比赛网络.网络中有n台机器,编号0~n-1,其中机器0为服务器,其他机器为客户机.一共有m条可以使用的网线,其中第i条网线的发送端是机器ui,接收端是机器vi(数据只能从机器ui单向传输到机器vi),带宽是bi Kbps,费用是ci元.每台客户机应当恰好从一台机器接收数据.你的任务是最大化网络中的最小带宽. InputFirst line of input contains T (≤ 50), the number of test cases. Th…