随笔分类 -  图论

摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1569题解:因为这个数据比较大,所以用动态规划会超时。将图转换成黑白棋盘问题,i + j 为奇数的与s节点相连,边的权值为棋盘上对应位置的值,其他的与t节点相连,边的权值为棋盘上对应位置的值,然后让棋盘上相邻之间的节点用边相连,边的权值为INF。这样问题就转换为了最大点权独立集问题。定理:1、最大点权独立集 = sum - 最小点权覆盖集。2、最小点权覆盖集 = 最小割 = 最大流dinic实现:#include #include #include #include #include using n 阅读全文
posted @ 2013-05-29 21:59 一生挚爱 阅读(188) 评论(0) 推荐(0)
摘要:题目大意:给出一个图,其中有一些点是出口,现在有一个罪犯有一个警察,各在两个不同的点。其中警察有一个最大速度160,问罪犯最少需要多大的速度,保证能从某个出口逃跑。一开始看了题目没什么感觉,当将题目看了两三遍后就发现只要到某一个点罪犯用的时间比警察的少则在那个点不会被抓,很显然,到某一个点会走最短路径。所以要用到两次最短路算法,二分罪犯车子的速度,然后搜索在当前速度下是否可以逃脱。注意的地方:1、对于无解可以spfa或者bfs判断一下,上面提出的有解的必要条件肯定没问题2、对于罪犯对整个图的最短路,需要注意的是不能经过警察的起点3、在二分速度之后,判断可以bfs,或者dfs,便是判断可以走到哪 阅读全文
posted @ 2013-05-28 20:59 一生挚爱 阅读(204) 评论(0) 推荐(0)
摘要:【关键字】0/1分数规划、最优比率生成树、最优比率环 【背景】根据楼教主的回忆录,他曾经在某一场比赛中秒掉了一道最优比率生成树问题,导致很多人跟风失败,最终悲剧。自己总结了一些这种问题的解法,因为水平有限,如果有错误或是麻烦的地方,尽管喷,邮箱或是下方留言。 联系我的话perseawe@163.com,欢迎讨论,请在标题前注明[acm]或是[oi],以免被垃圾邮件。【知识储备】只会用到简单的公式的整理与变形,还有求和sigma。【定义】01分数规划问题:所谓的01分数规划问题就是指这样的一类问题,给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价。如果选取i,定义x[i]=1否则 阅读全文
posted @ 2013-05-17 15:37 一生挚爱 阅读(163) 评论(0) 推荐(0)
摘要:标签:图论Havel-Hakimi定理poj1659原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。http://sbp810050504.blog.51cto.com/2799422/883904 我一直想写一些关于图论学习的收获。一直由于这样或者那样的原因都没有开始。无论如何,现在开始吧!那么到底什么是图呢?我们这里说的图当然不是像照片一样的东东。最权威的定义:图=顶点集合+边集合。换言之,凡是能抽象成点集合和边集合的东西都是图。比如:中国地图。地图上的城市是一个个的点,而任意两个相邻城市之间有路。那么地图就是很直观的一种图。为了更方便的 阅读全文
posted @ 2013-04-23 15:29 一生挚爱 阅读(491) 评论(0) 推荐(0)
摘要:最近又复习了下最大流问题,每次看这部分的内容都会有新的收获。可以说最大流问题的资料网上一搜一大把,根本没有必要自己写;但是大部分资料上的专业术语太多了,初学很难理解,至少我当年学这部分的时候前几次就没有看懂。所以我准备备份一点个人的理解。图-1如图-1所示,在这个运输网络中,源点S和汇点T分别是1,7,各边的容量为C(u,v)。图中红色虚线所示就是一个可行流。标准图示法如图-2所示: 其中p(u,v) / c(u,v)分别表示该边的实际流量与最大容量。关于最大流熟悉了什么是网络流,最大流也就很好理解了。就是对于任意的u∈V-{s},使得p(s,u)的和达到最大。上面的运输网络中,最大流如图-3 阅读全文
posted @ 2012-09-17 16:13 一生挚爱 阅读(410) 评论(0) 推荐(0)
摘要:Ant TripTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 434 Accepted Submission(s): 179Problem DescriptionAnt Country consist of N towns.There are M roads connecting the towns.Ant Tony,together with his friends,wants to go through every part of .. 阅读全文
posted @ 2012-09-17 09:10 一生挚爱 阅读(120) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1878欧拉回路:http://baike.baidu.com/view/566040.htm无向图存在欧拉回路充要条件: 一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数且该图是连通图有向图存在欧拉回路的充要条件: 一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图混合图存在欧拉回路充要条件: 要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下: 假设有一张图有向图G',在不论方向的情况下它与G同构。并且G'包含了G的所有有向边。那么如果存在一个 阅读全文
posted @ 2012-09-14 15:11 一生挚爱 阅读(195) 评论(0) 推荐(0)
摘要:本沙茶今年AHOI的时候,遇到裸的最佳匹配的题,竟然把KM算法搞忘了,幸亏是WJMZBMR神犇保佑,临时乱弄一通,想起来了……这MS反映出了本沙茶以前在看某些经典算法的时候看得不深,木有理解透彻……前几天又遇到一道最佳匹配的题,发现KM算法竟然又忘了……米办法,只有把这个搞死人的算法的具体过程重新看了一遍,终于懂了……【KM算法及其具体过程】(1)可行点标:每个点有一个标号,记lx[i]为X方点i的标号,ly[j]为Y方点j的标号。如果对于图中的任意边(i, j, W)都有lx[i]+ly[j]>=W,则这一组点标是可行的。特别地,对于lx[i]+ly[j]=W的边(i, j, W),称 阅读全文
posted @ 2012-09-10 21:02 一生挚爱 阅读(476) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1498/* 题意: 给你一个n*n的矩阵,在矩阵中分布着s种颜色的气球,给你k次扎破气球 的操作,每次操作可以扎破一行,或一列的同一颜色的气球。问在k次操 作后有那几种颜色的气球是不能被完全扎破的. 解题思路: 使用二部图最大匹配,寻找每种颜色的最大匹配数,(行,列分别为两个匹配) 如果都在m次内可以被刺破,则输出 -1 否则的话,按不能被刺破的气球 编号从小到大进行输出。*/#include#include#include#define maxn 101int map[max... 阅读全文
posted @ 2012-09-10 15:03 一生挚爱 阅读(161) 评论(0) 推荐(0)
摘要:【二分图】二分图是一种特殊的图结构,所有点分为两类,记做x和y,所有的边的两端分别在x和y,不存在两端同在x或y的边。【最大匹配、完备匹配】给定一个二分图(x,y),找到一种匹配数最大的方案,记做最大匹配。|x|=|y|=匹配数时,我们称该匹配方案为完备匹配。显然,解决了最大匹配也就解决了完备匹配。解决二分图的最大匹配可以用网络流或者匈牙利算法,两者本质上是相同的,不过不论从编程复杂度还是运行效率来讲,匈牙利算法都更加优秀。关于匈牙利算法,可以参见我以前写的文章:用匈牙利算法求二分图的最大匹配这里我主要叙述另一类问题:【最优完备匹配】对于二分图的每条边都有一个权(非负),要求一种完备匹配方案, 阅读全文
posted @ 2012-09-08 21:20 一生挚爱 阅读(499) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1054简单二分匹配,根据题意构造一个无向图。然后求最小点覆盖,然后扫描mark数组将曾经匹配的点所匹配的边消去。最小点覆盖 = 最大二分匹配#include#include#define maxn 1505struct node{ int v; node *next;}*head[maxn],edge[maxn*maxn],*p;int n,vis[maxn],mark[maxn];bool dfs(int v){ for(node *p = head[v]; p ; p = p->next) 阅读全文
posted @ 2012-09-08 20:30 一生挚爱 阅读(137) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1281本题为简单最小点覆盖。只需先求出最小点覆盖然后枚举所有的点。#include#include#define maxn 105bool map[maxn][maxn],vis[maxn];int n,m,k,mark[maxn],edge[maxn*maxn][2];bool dfs(int v){ for(int i = 1; i Hungarian()) sum ++; map[edge[i][0]][edge[i][1]] = true; } printf("Board %... 阅读全文
posted @ 2012-09-07 22:32 一生挚爱 阅读(105) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1151题目大意:考虑一个城市的街道都是单向的并且所有的道路都是从一个十字路口到另一个十字路口。从一个起点出发,沿着路走你永远都不可能回到起点,也就是说道路没有环。对于这样的一个假设,你的任务是编写一个程序,它可以找到让最小数量的伞兵,他们可以沿着路走经过所有的十字路口。而且一个十字路口不能被两个,或两个以上的人经过。每一个伞兵降落在一个十字路口,可以访问其他城镇街道后的十字路口。没有限制的起动交叉对于每个伞兵。解题思路:因为街道是有向的,而且不存在环,要到达所有的顶点我们可以转换为二分图的最小路径覆 阅读全文
posted @ 2012-09-07 21:36 一生挚爱 阅读(158) 评论(0) 推荐(0)
摘要:【基本概念】:二分图:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。最大匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 选择这样的边数最大的子集称为图的最大匹配问题,如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹. 阅读全文
posted @ 2012-09-07 20:33 一生挚爱 阅读(139) 评论(0) 推荐(0)
摘要://二分图的最小顶点覆盖数=最大匹配数//本题就是求最小顶点覆盖数的。#include#include#define maxn 105int n,m,k;bool map[maxn][maxn],mark1[maxn];int mark[maxn];bool dfs(int v){ for(int i = 1; i <= m; i++) { if(mark1[i] || !map[v][i]) continue; mark1[i] = true; if(!mark[i] || dfs(mark[i])) { mark[i] = v; return true; } } re... 阅读全文
posted @ 2012-09-07 16:55 一生挚爱 阅读(172) 评论(0) 推荐(0)
摘要:过山车Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5297 Accepted Submission(s): 2341Problem DescriptionRPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Gras 阅读全文
posted @ 2012-09-07 16:07 一生挚爱 阅读(174) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3986题意:给出一个无向图,Harry Potter的目的是从1到n,而Voldemort为了阻止他,使用魔法毁掉了图中的一条边,问最坏情况下Harry要走的最短路是多少。注意:两点间可以能存在多条路,而且路是双向的,找到最短路后枚举边,求的最短路中最长的那条即为所求,#include#include#includeusing namespace std;const int maxn = 1005;const int INF = 1que;void spfa(bool flg){//求起点到终点的最 阅读全文
posted @ 2012-09-06 19:58 一生挚爱 阅读(151) 评论(0) 推荐(0)
摘要:题目地址:题解:题目意思为从起点到终点的最短路中有一条路不能通过了,求到从起点到终点的最短距离。可以先找出从起点到终点的最短距离,并将路径保存下来,然后枚举最短路径中的所有路径,求出从起点到终点的最短路径中最长的一条。#include#include#includeusing namespace std;const int maxn = 1005;const int INF = 200000000;struct node{ int v,t; struct node *next;}*head[maxn],edge[maxn*maxn];int n,m,dis[maxn],per[maxn];bo 阅读全文
posted @ 2012-09-06 15:40 一生挚爱 阅读(203) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3790最短路问题,因为结果会超int所以最终结果要用__int64位保存。当距离相等的时候,去费用小的路走。#include#includeusing namespace std;#define INF (1v = end; p->d = d; p->cost = cost; p->next = head[start]; head[start] = p++;}void spfa(int start){ int i; for(i = 1; i Q; Q.pus... 阅读全文
posted @ 2012-09-05 21:58 一生挚爱 阅读(120) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1548本题为简单最短路,构图方法为如果在第i层可以上升Ki层则增加边i - >(i+Ki) 否则不加边,如果可以下降Ki层则增加边i-> (i - Ki)#include#include#includeusing namespace std;#define maxn 205#define INF (1que; que.push(start); while(!que.empty()) { int now = que.front(); vis[now] = true; que.pop(); 阅读全文
posted @ 2012-09-05 21:51 一生挚爱 阅读(173) 评论(0) 推荐(0)