图论
文章平均质量分 72
未水
这个作者很懒,什么都没留下…
展开
-
poj2186 有向图强连通缩点
真心不能用vector同样的代码,用vector500+ms,用邻接表32ms#include #include #include #include #include #include #include #include using namespace std;int n,m ;#define N 10500#define M 60000//vectore[N];原创 2013-03-13 20:10:50 · 887 阅读 · 0 评论 -
hdu4751 two-sat
two-sat问题的特点是:每种物品之间有相互限制关系,每种物品不是属于A集合就是属于B集合。复杂度是n^2(u,v)相互认识,即u和v可以在同一个集合里,但并不一定,对这样的(u,v)不建立限制关系(u,v)不相互认识,可能u->v但没有v->u,一定不在同一集合里,他们的关系是“u为真则v为假”和“v为真则u为假”当染u为真时则必须染v为假,建边;当染u为假时则必须染v为真,建原创 2013-09-22 01:01:25 · 1320 阅读 · 0 评论 -
带花树(一般图最大匹配)详解 ZOJ 3316
{CSDN:CODE:3423010}原创 2013-09-06 23:59:07 · 9291 阅读 · 1 评论 -
hdu 4587 割点 2013 ACM-ICPC南京赛区全国邀请赛
长期用tarjan,每次一上来直接缩点,弄得连基本的割点割边都不太会,其实道理差不多的还是tarjan的那个过程,不过不用维护一个栈枚举删掉的第一个点,割点算法跑一遍,在跑一遍的过程中记录每个点(除了删除的那个点)和多少个连通分支相连注意一个连通分支只有一个点的时候,删掉它,这个连通分支就没有了#include #include #include #include #inc原创 2013-08-18 11:01:09 · 2734 阅读 · 3 评论 -
hdu 4640 多校第四场 状态压缩+最短路+dp
应该注意到n很小,说明我们可以位压缩处理每种状态预处理出一个人从1出发,已经走到哪些点(用状态记录),最后到达哪个点的最小花费,用广搜spfa之后i个人走,是一个人的效果的i次叠加,用类似背包的过程,注意要从大到小枚举状态,避免转移重复,dp标程错了,它处理成不能回到1,我wa了很久,主要手写队列搞挫了。。。开始时不会做是因为看不到问题的本质,本质就是搞出一个人时候的最短路,然后d原创 2013-08-03 20:06:52 · 1129 阅读 · 0 评论 -
codeforces 78E - Evacuation 最大流
不能一一贪心暴搜,因为每个人的决策会对其他人产生影响必须用能考虑到全局的做法最大,全局,想到最大流初始化dp[t][x][y][nx][ny] 表示在t时间内能从(x,y)到达(nx,ny)有个地方要注意假如某点在k+1时间之前已经infected,下一步不能取但刚好在k+1时infected,可以到达#include #include #include原创 2013-07-16 11:10:02 · 1397 阅读 · 0 评论 -
UVA LIVE 5053 World Cup Nominations--有向图强连通
1.强连通里面的点可以到达彼此,即存在a->b 和 b->a,通过某些途径可以打败彼此,果断缩点,如果块里面某一点能赢,那么其他点也能赢,反之也是2.缩点后各块之间,对于某两个块,只可能块a的边全部指向块b,不会有a->b又有b->a,能赢的那些点一定是没有块指向它的,否则它还是不可能打败所有#include #include #include #include #原创 2012-10-05 21:06:04 · 853 阅读 · 0 评论 -
浅显易懂二分图-最大匹配,最小路径覆盖,最小点覆盖
正式的定义,网上一大把,但他们的作用是让人看不懂……二分图:把点分成两个集合X,Y,使得图的边的两个端点总是分别落在X和Y上,不会有X中的点连向X中的点,不会有Y中的点连向Y中的点匹配:实质上是二分图中的一个边集,边集中出现的点不会重合,比如有a-b了,就不会有a-c了,要是有了a就重合了最大匹配:这个边集的数目最大的那个匹配 匈牙利算法——增广路:一条在X和Y之间交错的路原创 2012-11-14 21:25:26 · 4551 阅读 · 0 评论 -
hdu 4081 最小生成树
先求出最小生成树,然后枚举树上的边,对于每条边“分别”找出这条割边形成的两个块中点权最大的两个1.由于结果是A/B,A的变化会引起B的变化,两个制约,无法直接贪心出最大的A/B,故要通过枚举2.不管magic road要加在哪里,加的边是否是最小生成树上的边,都会产生环,我们都要选择一条边删掉注意删掉的边必须是树的环上的边,为了使结果最大,即找出最大的边3.可以枚举两点,找出边,也原创 2012-10-03 23:23:01 · 2827 阅读 · 0 评论 -
hdu4005 缩点+无向图+重边
奉上数据:6 71 2 12 1 12 3 13 4 14 3 11 6 24 5 35 81 2 12 1 12 3 23 2 23 4 34 3 34 5 45 4 41 07 71 2 12 4 23 4 14 3 13 5 23 6 36 7 3原创 2012-10-22 11:12:49 · 1430 阅读 · 0 评论 -
POJ 3422 费用流
刚开始用dp做一直不过,想不通。看了别人报告才知道,dp没有解决后效性,即当前的决策会对下一次travel。出不了数据,但觉得数据大的时候应该会错这类k次操作,每次操作代价都不同,求最大或者最小代价的问题,只能用费用流http://hi.baidu.com/graphis/item/74b8afc6ec27f870f6c95d50从多进程动态规划到费用流的转化,这里讲的很好原创 2013-06-07 16:01:52 · 555 阅读 · 0 评论 -
树的同构--poj 1635(有根树)ustc 1117 (无根树)
只有一个点入度为0的树是外向树,只有一个点出度为0的树是内向树,这两种是典型的有根树平时见到的无向图中的树是无根树1.判断树同构本质是哈希,每个点的权值是这个点的子树的权值和,这里所谓的权值是随机数产生的由于随机性,树上某一组合不同都会导致最终的结果不一样,所以只要判断根的权值是否相等就可以确定同构2.随机性决定了不确定性,但正确率还是很高3.可以不用哈希,用“最小表示”表示出原创 2012-10-04 21:37:34 · 3976 阅读 · 0 评论 -
UVAlive 5027 card game KM
以为思路错、模板错WA了好久原来是看错题,吸取教训了!#include #include #include #include #include using namespace std;#define N 300#define INF 20000000int cal(char *a,char *b){ int lena=strlen(a); int原创 2012-10-14 15:16:43 · 573 阅读 · 0 评论 -
uvalive 5026 树-直径
这个问题挺有趣,所以锲而不舍想要知道怎么做了解之后发现也挺直观和朴素,怎么当时就想不出来呢。。1.求最长路2.要移动的边肯定在最长路上3.枚举最长路上的每条边,对于每条边u->v(权值为w),移动它的策略是把u,v两个端点接在两边子树的最长路的中间位置4.接好后的最长路不一定是 x+w+y,还有可能是两个子树的最长路,要判断下#include #include原创 2012-10-18 19:56:08 · 698 阅读 · 0 评论 -
poj 3308 最小割
应用到:最小割等于最大流定理技巧:割边的乘积最小,用log转化!!太好了!!#include #include #include #include #include #include #include using namespace std;int m,n,l,s,t;#define N 120#define M 2000const double INF =1000000原创 2013-03-31 20:54:51 · 666 阅读 · 0 评论 -
poj 1258 最小生成树 prim+优先队列
想手打个堆优化,搞半天一直WA,悲剧……#include #include #include #include #include #include #include using namespace std;#define M 550000#define N 5500#define INF (1<<30)struct Edge{ int v,w; Edge(int原创 2012-10-10 09:23:52 · 1372 阅读 · 0 评论 -
hdu4750 最小生成树
关键是利用“所有从s到t的路径上的最长边的最小值”这个条件,我们所要的只是这个最小值:对于(s,t),这个最小值一定是s到t的最短路上的最长边,则所有可能被取到的边是最小生成树上的边因为最小生成树利用的就是贪心,树上的边都是图上每两点间的最短路会经过的边实现:在kruskal的过程中,添加一条边,权值为w,两个连通分量u和v变为连通,有num[u]*num[v]*2对pair会取到原创 2013-09-22 13:48:21 · 1186 阅读 · 0 评论