随笔分类 -  ACM_图论

摘要:最大权闭合图完美的解决了网络流中,对节点间>1的依赖关系。 hdu 5845 (二分+最大权闭合图) 阅读全文
posted @ 2016-08-26 10:33 chenhuan001 阅读(167) 评论(0) 推荐(0) 编辑
摘要:题目链接 比赛时用dp想了两个小时。。 看了题解说是网络流,感觉被打脸。 知道了这个模型之后,这题就是套个模板直接水过的了。 先拆点限流,把mid当源点,然后把a做汇点跑一次网络流,再把b做汇点跑一次网络流。 mdwzszz (第一次网络流,分两次跑) code: 阅读全文
posted @ 2016-07-04 13:14 chenhuan001 阅读(879) 评论(0) 推荐(0) 编辑
摘要:这题思路很简单,二分m,求最大流是否大于等于x。 但是比赛过程中大部分的代码都被hack了。。。 精度问题,和流量可能超int 关于精度问题,这题真是提醒的到位,如果是先用二分将精度控制在10^-8左右,最后乘一个10^4,精度只能在10-4,而二分控制精度在10^-11很容易死循环(因为doubl 阅读全文
posted @ 2016-03-20 13:16 chenhuan001 阅读(180) 评论(0) 推荐(0) 编辑
摘要:题意很简单,在一颗树上找最小点覆盖。将树染成黑白两色,构成一张二分图,然后最大匹配==最小点覆盖即可,所以一次匈牙利就可以求出来了hdu1054#include #include #include #include #include #include #include #include #inclu... 阅读全文
posted @ 2014-11-05 23:47 chenhuan001 阅读(312) 评论(0) 推荐(0) 编辑
摘要:这题好坑,卡SPFA。。。无奈只能用dij+优先队列了。 因为好久没有写过代码了,所以今天写dij时候突然觉得复杂度不对,dij+优先队列的复杂度是(n+m)logn,这种复杂度对于稠密图是非常慢!,而且还有超内存的可能(最坏情况要把n*n个点都存进优先队列),与我以前记得复杂度是nlogn不一样。... 阅读全文
posted @ 2014-10-05 11:20 chenhuan001 阅读(330) 评论(0) 推荐(0) 编辑
摘要:比赛的时候没有想到二分图,一直在想dp和贪心。 原因是因为看到数据是100000所以直接就没有往二分图匹配上想。现在想想。 因为二分图两边的太不对称了,60 和100000 , 如果用匈牙利算法考虑的话,左边的点应该可以很快的找到一个与之匹配的点。 如果边不多的话那么找起来也是很快的。还是太弱。I'm Telling the TruthTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1129Accepted Submission(s): 阅读全文
posted @ 2013-10-20 18:38 chenhuan001 阅读(469) 评论(0) 推荐(0) 编辑
摘要:这种思想很经典。 从最小的边选择,那么可以知道的是,在除去这条边的另外两个联通块,选其中一块中的点做为源点到另一块所得到的费用和。 如果你已经知道了这两个联通块内部选一个点时的最大费用和。那么这题就可以直接得到答案了,然后用递归思想独立的求这两块联通块。但是这样不好实现。 如果再反着想, 把边从大到小放入图中然后记录每个联通块的最大值。 然后就是合并的时候选择的问题了 。经典的思想,要好好记下 。#include #include #include #include #include #include #include #include #include using namespace std 阅读全文
posted @ 2013-10-07 08:57 chenhuan001 阅读(408) 评论(0) 推荐(0) 编辑
摘要:int stk[N],vis[N],low[N],link[N],mark[N];int top,index,id,du[N];//记录入度数int pre[N],cnt,g[N];// g 用来记录topsort后的结果int g1[N]; //用来记录缩点后的每一个点所含的点void dfs(int s){ mark[s]=1; vis[s]=index++; low[s]=vis[s]; stk[top++]=s; for(int p=pre[s];p!=-1;p=edge[p].next) { int v=edge[p].to; ... 阅读全文
posted @ 2013-10-03 17:14 chenhuan001 阅读(355) 评论(0) 推荐(0) 编辑
摘要:基础的2-SAT求任意方案的题目。Priest John's Busiest DayTime Limit: 2000MSMemory Limit: 65536KTotal Submissions: 7309Accepted: 2492Special JudgeDescriptionJohn is the only priest in his town. September 1st is the John's busiest day in a year because there is an old legend in the town that the couple who g 阅读全文
posted @ 2013-10-01 22:37 chenhuan001 阅读(304) 评论(0) 推荐(0) 编辑
摘要:2-SAT 求出可能的解,但是这个解要是字典序最小的,所以只能采用2-SAT基本思想来解。从小到大开始,对一个可能的点染色,染为1,然后dfs其所有能到达的点,如果其中出现一个已经标号为-1的话,那么就说明这个点不能选。 然后把之前标好的号清除掉。 如果没有出现的话,那么就保持染色。 如果出现同一集合的两个点都不能染色的话就说明无解。 否则输出所有染为1的点。Peaceful CommissionTime Limit: 10000/5000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 阅读全文
posted @ 2013-10-01 15:05 chenhuan001 阅读(263) 评论(0) 推荐(0) 编辑
摘要:#define N 100100#define M 200200int n,m;int id,index; //id表示缩点后点的id,index表示进行tarjan算法时访问的点先后int vis[N],low[N]; //vis表示到当前点的时间,low表示当前所能到达的最小时间.int stk[N],top; //表示栈int mark[N];int link[N]; //将点与缩点后的点相连.int sum[N]; //强连通分量中点的个数void dfs(int tarjan_s){ vis[tarjan_s]=++index; low[tarjan_s]=vis[tar... 阅读全文
posted @ 2013-08-22 15:11 chenhuan001 阅读(372) 评论(0) 推荐(0) 编辑
摘要:先用网络流求出残留网络,然后根据题意要求出增大那些边的容量使得总的流量最大, 我的做法比较水, 枚举残余网络中的饱和边,然后在bfs找增广路,如果找的到增广路,那么说明增加这条边的容量可是使得最大流变大。还有一种更简单的方法, 在求出残余网络后,从源点和汇点分别bfs一次,如果一条边的一端顶点可以从源点到达,另一端的顶点可以被汇点到达,那么说明增加这条边的容量可以增大总的流量。InternshipTime Limit:5 Seconds Memory Limit:32768 KBCIA headquarter collects data from across the country thro 阅读全文
posted @ 2013-05-29 20:13 chenhuan001 阅读(137) 评论(0) 推荐(0) 编辑
摘要:和poj 3352 一样, 相同的代码都能过。#include <stdio.h>#include <string.h>#include <iostream>using namespace std;#define N 5050#define M 10010#define INF 0x3fffffffstruct node{ int from,to,next;}edge[2*M];int n,m;int cnt,pre[N];bool mark[2*M];bool save[2*M];int low[N];int link[N];int d[N];void a 阅读全文
posted @ 2013-05-20 17:41 chenhuan001 阅读(137) 评论(0) 推荐(0) 编辑
摘要:先求出桥,然后去除桥后得到边双联通分量, 将边联通分量缩成一个点, 然后就出所有度为1的点(叶子节点)个数n,答案就是n/2+n%2.#include <stdio.h>#include <string.h>#include <iostream>using namespace std;#define N 5050#define M 10010#define INF 0x3fffffffstruct node{ int from,to,next;}edge[2*M];int n,m;int cnt,pre[N];bool mark[2*M];bool save 阅读全文
posted @ 2013-05-20 17:26 chenhuan001 阅读(142) 评论(0) 推荐(0) 编辑
摘要:比较简单LCA的题目了, 主要就是根据题目所给出的树边建立有向的树, 然后从树根开始进行LCA, 要注意的是,题目中给的操作有两种,第一种是从当前点到父亲结点,第二种是从当前点到子树中的任意一个点。CD操作Time Limit: 10000/5000 MS (Java/Others)Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 102Accepted Submission(s): 24Problem Description 在Windows下我们可以通过cmd运行DOS的部分功能,其中CD是一条很有意思的命令,通过. 阅读全文
posted @ 2013-05-17 21:54 chenhuan001 阅读(248) 评论(0) 推荐(0) 编辑
摘要:先求出点的双联通分量,每个分量可以看成一系列相邻的环, 且只要在一个联通分量发现奇数环那么这个分量的所有点都在奇环中.Knights of the Round TableTime Limit:7000MSMemory Limit:65536KTotal Submissions:7598Accepted:2358DescriptionBeing a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress, and drinking with the other kni 阅读全文
posted @ 2013-05-17 18:51 chenhuan001 阅读(158) 评论(0) 推荐(0) 编辑
摘要:寻找割边又叫桥。 和找割点的很类似Burning BridgesTime Limit:5 Seconds Memory Limit:32768 KBFerry Kingdom is a nice little country located on N islands that are connected by M bridges. All bridges are very beautiful and are loved by everyone in the kingdom. Of course, the system of bridges is designed in such a way t 阅读全文
posted @ 2013-05-15 13:46 chenhuan001 阅读(156) 评论(0) 推荐(0) 编辑
摘要:用了#include <sstream> 来处理前面的数据,太好用了其他的就是用类似tarjan的算法来求割点.NetworkTime Limit:1000MSMemory Limit:10000KTotal Submissions:7537Accepted:3546DescriptionA Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to N . N 阅读全文
posted @ 2013-05-14 09:49 chenhuan001 阅读(183) 评论(0) 推荐(0) 编辑
摘要:狠狠的复杂度 n*n*n*n*m 。。。 你是在开玩笑嘛。。求最小割集的办法,枚举两个不相邻的点分别作为源点和汇点, 看流过的流量为多少, 为了体现一个点只能用一次所有每个点要拆成两个点Cable TV NetworkTime Limit:1000MSMemory Limit:30000KTotal Submissions:3424Accepted:1593DescriptionThe interconnection of the relays in a cable TV network is bi-directional. The network is connected if there 阅读全文
posted @ 2013-05-14 08:15 chenhuan001 阅读(363) 评论(0) 推荐(0) 编辑
摘要:结合tarjan算法思想,这题终于写了出来。同样用dfs将图变成为一颗树,这样可以提供许多有用的性质。对于一个无向连通图,dfs后的树为只有回边(回边Euv,v是u的祖先)和生成树的边的图。 那么在遍历到一个点u的时候,可以知道如果不考虑这个点,如果与u相邻的点连通那么u不是割点,否则是割点。 那么只需要判断与u相邻的点是否连通就行了,于是借鉴tarjan求强连通的办法,在dfs时,对每个点标记一个深度low[N]也就是从根到这个点最短路径(经过的最小结点数), 然后在遍历到u点的时候,看看与u相邻的点v的low[v], 如果low[U] >= low[u]那么说明u就是割点. 因为v点 阅读全文
posted @ 2013-05-13 14:08 chenhuan001 阅读(202) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示