随笔分类 -  ACM_图论

摘要:题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1997 题意:记录了n个人进出门的时间点,每个人在房子里面待的时间要么小于等于a,要么大于等于b,询问能否对进出门的时间点找到一个合适的匹配。 对于满足的要求建立边即可,然后看是否能找到最大匹配。 1 //STATUS:C++_AC_109MS_4361KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #incl... 阅读全文
posted @ 2013-10-31 00:21 zhsl 阅读(354) 评论(0) 推荐(0)
摘要:题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1982 题意:无向图,给n个点,n^2条边,每条边有个一权值,其中有k个点有发电站,给出这k个点的编号,选择最小权值的边,求使得剩下的点都能接收到电。 发电站之间显然不能有边,那么把k个点合成一个点,然后在图上就MST就可以了。 1 //STATUS:C++_AC_31MS_401KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #inc... 阅读全文
posted @ 2013-10-30 00:13 zhsl 阅读(714) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4751 题意:有n个人,每个人都认识一些人,要求把他们分成两个集合,使得两个集合中的人都相符两两认识。 如果两个人单向认识或者相互不认识,那么必定在不同的集合,因此建立边,染色就可以了。。 1 //STATUS:C++_AC_31MS_388KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #... 阅读全文
posted @ 2013-09-28 11:10 zhsl 阅读(328) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4750 题意:Q个询问t,求在一个无向图上有多少对点(i,j)满足 i 到 j 的所有路径上的最长边的最小值大于等于t。 (i,j)所有路径上的最长边的最小值,容易想到就是 i, j之间的瓶颈路,瓶颈路也就是最小生成树上的边了。注意到每条边的权值都是不相等的,那么MST就是确定的。假设当前MST的边的权值是f[i],Kruskal的并查集中维护一个cnt[i],表示以节点 i 为根的集合的节点个数,那么两个集合x和y合并,点对数就增加cnt[fa[x]]*cnt[fa[y]]*2,sum为点... 阅读全文
posted @ 2013-09-28 11:07 zhsl 阅读(359) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:在有重边的无向图中,求权值最小的桥。 注意trick就好了,ans为0时输出1,总要有一个人去丢炸弹吧。。。 1 //STATUS:C++_AC_62MS_8144KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #includ... 阅读全文
posted @ 2013-09-28 00:18 zhsl 阅读(283) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 如果直接建图复杂度过大,但是考虑到每层之间的有效边很少,只要在每层增加两个虚拟节点n+i和2*n+i。n+i节点向i 层的所有连边,权值为0。i 层的所有点向2*n+i节点连边,权值为0。然后每层直接建立边就可以了,即2*n+i-1向n+i连边,权值为c,2*n+i向n+i-1连边,权值为c。3*n个点,最多有有9*n条边。。 1 //STATUS:C++_AC_730MS_14340KB 2 #include 3 #include 4 #include 5 //#in... 阅读全文
posted @ 2013-09-13 00:42 zhsl 阅读(321) 评论(0) 推荐(0)
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26586 题意:给一个图,每条边有一个权值。要你求选择一棵树,权值和为sum,然后在树上选择一条边权值为w,然后使得sum-2*w最小。 首先求一遍最小生成树,然后求出每两个点之间的最小瓶颈路,然后枚举边就行了。。 1 //STATUS:C++_AC_916MS_30048KB 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define... 阅读全文
posted @ 2013-08-27 02:45 zhsl 阅读(315) 评论(0) 推荐(0)
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26480 题意:简单来说,就是给一个图,然后从每个honor list中的点求最短路。。 边权值为1,Bfs就可以了,注意这里是无向图。。 1 //STATUS:C++_AC_84MS_1788KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #inclu... 阅读全文
posted @ 2013-08-26 10:21 zhsl 阅读(279) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4696 题意:给一个图,每个点的出度为1,每个点的权值为1或者2。给n个询问,问是否能找到一条路径的权值和M。。。 首先由于每个点的出度为1,所以必然存在环。容易证明,一个环中存在1或者与环相连的路径存在权值为1的节点,那么必然每个数都能组成,如果没有1那么所有偶数都能组成。。。 可以无视代码> 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #i... 阅读全文
posted @ 2013-08-22 19:35 zhsl 阅读(501) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4687 题意:给一个无向图,求所有的最大匹配的情况所不包含的边。。 数据比较小,直接枚举边。先求一次最大匹配hig,然后依次枚举所有边,假设此边为一个匹配,那么删掉边的两个节点,然后再剩下的图中求最大匹配t,如果t 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #incl... 阅读全文
posted @ 2013-08-21 14:39 zhsl 阅读(620) 评论(0) 推荐(0)
摘要:看了两篇博客,觉得写得不错,便收藏之。。 首先是第一篇,转自某Final牛带花树……其实这个算法很容易理解,但是实现起来非常奇葩(至少对我而言)。除了wiki和amber的程序我找到的资料看着都不大靠谱比如昨晚找到一篇鄙视带花树的论文,然后介绍了一种O(E)的一般图最大匹配……我以为找到了神论文,然后ACM_DIY众神纷纷表示这个是错的……于是神论文成为了”神论文“……又比如围观nocow上带花树标程,一看……这显然是裸的匈牙利算法……货不对板啊当然……如果二分图的匈牙利算法还不会请先围观求二分图最大匹配的匈牙利算法。实际上任意图求最大匹配也是找增广路,但是由于奇环的出现,找增广路变得困... 阅读全文
posted @ 2013-08-21 00:28 zhsl 阅读(6481) 评论(0) 推荐(1)
摘要:题目链接:http://poj.org/problem?id=3241 题意:平面上有n个点集,现在把他们分成k个集合,使得每个集合中的每个点都至少有一个本集合的点之间的曼哈顿距离不大于X,求最小的X。 题目要求划分集合之后,每个集合的曼哈顿最小生成树的最长边不超过X,那么容易想到就是整个点集的曼哈顿最小生成树的第n-k条边。。 那么主要就是求曼哈顿最小生树的问题了,有O(logn)的算法可以轻松解决建图的问题,主要是利用到了环切的性质,考虑到很多边其实都是没有用的:对于某个点,以他为中心的区域分为8个象限,对于每一个象限,只会取距离最近的一个点连边。。 ... 阅读全文
posted @ 2013-08-18 16:47 zhsl 阅读(1179) 评论(0) 推荐(0)
摘要:原文链接,。。。关于曼哈顿距离最小生成树,还推荐看一、曼哈顿距离最小生成树曼哈顿距离最小生成树问题可以简述如下:给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价。朴素的算法可以用O(N2)的Prim,或者处理出所有边做Kruskal,但在这里总边数有O(N2)条,所以Kruskal的复杂度变成了O(N2logN)。但是事实上,真正有用的边远没有O(N2)条。我们考虑每个点会和其他一些什么样的点连边。可以得出这样一个结论,以一个点为原点建立直角坐标系,在每45度内只会向距离该点最近的一个点连边。这个结论可以证明如下:假设我们以点A为原点建系,考虑在y轴向右.. 阅读全文
posted @ 2013-08-18 00:33 zhsl 阅读(681) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4665 本题的2-SAT建图颇为复杂,有时间再来填坑(自己写的一直挂着,标程建图太复杂了)。。。然后用暴力搜索,用一个栈保存第一个序列就可以了,因为题目是SPG,并且重复的最多只有四个,所以搜索很好过。。 1 //STATUS:C++_AC_62MS_276KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #incl... 阅读全文
posted @ 2013-08-10 00:25 zhsl 阅读(431) 评论(4) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给一个简单有向图(无重边,无自环),要你加最多的边,使得图还是简单有向图。。。 先判断图是否强连通。如果不是强连通的,那么缩点。我们的目的是加最多的边,那么最后的图中,肯定两个集合,这两个集合都是强联通的,一个集合到一个集合只有单向边。我们先让图是满图,然后通过删边来求的:有n*(n-1)条边,然后删掉已有的边m,然后还有删掉两个集合的边n1*(n-n1),n1为其中一个集合的顶点个数,因为这里是单向边。那么答案就是ans=n*(n-1)-m-n1*(n-n1),我们要使ans... 阅读全文
posted @ 2013-08-02 01:03 zhsl 阅读(338) 评论(2) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4619 一看就知道是二分匹配题目,对每个点拆点建立二分图,最后答案除2。因为这里是稀疏图,用邻接表处理。。。 1 //STATUS:C++_AC_31MS_480KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #in... 阅读全文
posted @ 2013-07-28 20:27 zhsl 阅读(204) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 简单图论题,先求图的边双连通分量,注意,此题有重边(admin还逗比的说没有重边),在用targan算法求的时候,处理反向边需要标记边,然后缩点,在树上求最长链。。 此题在比赛的时候,我的模板数组开小,WA一下午,sd。。。。 1 //STATUS:C++_AC_734MS_37312KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #... 阅读全文
posted @ 2013-07-28 18:20 zhsl 阅读(295) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先考虑找一条最长链长度k,如果mk+1,那么最长链上还有其他分支,来回走一遍,因此答案为2*m-k-1。。。求最长链可以DP,两次BFS或者DFS等。。 1 //STATUS:C++_AC_453MS_3524KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 ... 阅读全文
posted @ 2013-07-23 22:33 zhsl 阅读(334) 评论(0) 推荐(0)
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2365 我没看懂题目。。。这样理解:一个有向图,要给一些边染色,使得所用的颜色最多,且S到T的任意路径的都包含所有颜色。 或者:给定一个无向图,图中有一个起点S和一个终点T。要求选K个集合S1,S2,…,SK,每个集合都含有图中的一些边,任意两个不同的集合的交集为空。并且从图中任意去掉一个集合,S到T都没有通路。要求K尽量大。 容易想到最短距离就是总共的数量tot,然后在图上求一个层次图,只要点的距离标号i 3 #include 4 #includ... 阅读全文
posted @ 2013-07-23 00:58 zhsl 阅读(248) 评论(0) 推荐(0)
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2362 裸的匹配问题,直接KM,就算是O(n^4)的KM也不会超。当然注意到题目中左边的点到右点所连的边的权值是一样的,所以完全可以贪心拍个序,然后找增广路。。。 1 //STATUS:C++_AC_250MS_848KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include... 阅读全文
posted @ 2013-07-23 00:51 zhsl 阅读(237) 评论(0) 推荐(0)