图论
文章平均质量分 77
自在_飞花
这个作者很懒,什么都没留下…
展开
-
无向图求割点
using namespace std;const int MAXE = 300010;const int MAXP = 1010;struct N{ int v,next;}edge[MAXE*2];int head[MAXP];int Top;int high[MAXP];int low[MAXP];int subnet[MAXP];int dfsClock;原创 2015-05-15 15:04:13 · 1016 阅读 · 0 评论 -
初涉网络流 POJ 1459 Power Network
怒搞一下午网络流,又去我一块心病。从2F到SAP再到Dinic终于过掉了。可是书上说Dinic的时间复杂度为v*v*e。感觉也应该超时的啊,可是过掉了,好诡异。后两种算法都是在第一种的基础上进行优化。第一种方法就是不停的寻找增广路,后两种引进了层次网络的概念,第三种又#include #include #include #include #include #include原创 2014-07-03 00:04:41 · 895 阅读 · 0 评论 -
HDU 3395 Special Fish 最“大”费用最大流
求最大费用可以将边权取负以转化成求最小费用。然而此时依然不对,因为会优先寻找最大流,但是答案并不一定出现在满流的时候。所以要加一些边(下图中的红边)使其在答案出现时满流。设所有边的流量为1,花费如下图所示。显然最大花费是1001,而没有红边的情况下会得到3。#include #include #include #include #include #include #in原创 2014-07-22 20:49:58 · 967 阅读 · 2 评论 -
UVALive 6525 Attacking rooks
将行中连续的' . '当作X集的一个点,列中连续的’ . ‘看成Y集中的一个点,然后把每一个’ . ‘看成一条边,连接Xi,Yj。则问题转化成求此二分的最大匹配数。每找到一条匹配边的意义是找到了一个点放置一个,并且覆盖了所在的连续的行和列。所以答案即为此二分图的最大匹配。#include #include #include #include #include #inclu原创 2014-05-07 12:39:48 · 886 阅读 · 0 评论 -
二分图小结
此文意在整理二分图的各种变形。HDU 1068 Girls and Boys最基础的二分图匹配问题,简单的求最大匹配数。HDU 1150 Machine Schedule无向图 最小点集覆盖 = 最大匹配。把作业看成边,把机器看成点。无向图的最小点集覆盖是指存点集K,使得图中的所有边都与K中的某些点相连 ,且去除K任意一点就不再满足前述条件。HD原创 2014-05-06 15:49:57 · 815 阅读 · 0 评论 -
初涉二分图的最大权匹配 KM算法
对于一个赋权的二分图可以用KM算法求解最大权匹配的前提是该二分图存在完美匹配。若此二分图不存在完美匹配,则有两种方法。一是转化成网络流问题求解。二是添加一些点和权为0的边使其变为赋权完全二分图。 显然对于任何二分图通过第二种方法均能转化为存在完美匹配的二分图,且结果不会改变。故KM算法可以求解所有带权二分图的最大权匹配。KM算法中用到的几个概念:可行性标号,相等子图,交错树。原创 2014-04-02 19:37:58 · 3459 阅读 · 2 评论 -
SDUT 2838 Word ladder 图的直径
昨天周赛H题。。。当时第一发的时候手残了,改正之后发现好像题意不太对,感觉是找最长的一条没有重点的链,又是一张有环的图,不会做,果断放弃去切了另外一个题。之后也没有再读题,也没有分析样例。。。。直到赛后学姐说是找最短路中的最长路,我才发现自己跑偏了。。也就是说,设P(i,j) 表示 i 到 j 的最短路的长度,则答案为 anw = max( p(i,j) )(i != j)。其实此时 anw原创 2014-03-23 12:23:42 · 853 阅读 · 0 评论 -
POJ 2942 Knights of the Round Table 点的双连通分量 + 奇圈
给出一个无向图,然后计算出该图的补图,然后再计算补图中不再任一奇圈内的点的个数。首先要求出所有的点的双连通分量,然后判断每一个双连通分量中是否存在奇圈,若有,则该双连通分量中的任意一点均在某一个奇圈上。求解双连通分量的方法:设 rv[ ] 表示每个点在DFS时被访问的次序。原创 2014-02-16 20:58:37 · 931 阅读 · 0 评论 -
POJ 3114 Countries in War / HDU 2767 Proving Equivalences 强连通分量模板
强连通分量:若在一个点集U中,对于任意两个点u,v(u,v∈U && u != v),即存在一条从 u 到 v 的路径,也存在一条从 v 到 u 的路径,则称此集合为强连通分量。Taijan算法:借助 index[ ] 和 rv[ ] 两个数组,rv[ u ] 记录DFS访问 u 时 的时间戳,index[ u ] 记录在DFS树中,u及其子孙能通过反向边连接到的正在等待DFS回溯的点原创 2014-02-11 18:47:26 · 980 阅读 · 0 评论 -
POJ 3694 Network
求桥,缩点,LCA,还有重边,之后还要加Q条边,每次加完后询问一次桥的个数。。。个人感觉算是比较麻烦的题了。。。给出N个点,M条边,保证所有点连通,数据中有重边,之后加入Q条边,每次加完后,输出一个整数代表图中剩余的桥的数量。首先找出所有的桥,将桥删除,然后将双连通分量进行缩点,用桥将这些点连接起来,然后用LCA处理。对于每条新加入的边,首先判断其两端点被缩进了哪个点,设其分别被缩进了原创 2014-01-20 13:30:04 · 848 阅读 · 0 评论 -
POJ 3352 Road Construction 边的双连通分量 + 缩点
题意:最少添加几条边使得整个图变为边双联通分量。求出途中所有的桥,删除之。将剩下的边连通分量缩成一个点(此处可用并查集实现)。然后用桥将这些点连通,设图中度为一的点的个数为n,则(n+1)>>1,即为答案。边连通度:是一个原本连通的子图变成不连通所需要删除的最少的边数。桥:删除一条边使得原本连通的图变的不连通,则称此边为桥。边双连通分量:边连通分量大于等于二的子图称为边原创 2014-01-19 15:22:48 · 1072 阅读 · 0 评论 -
POJ 2135 Farm Tour && HDU 2686 Matrix && HDU 3376 Matrix Again 费用流求来回最短路
累了就要写题解,最近总是被虐到没脾气。来回最短路问题貌似也可以用DP来搞,不过拿费用流还是很方便的。可以转化成求满流为2 的最小花费。一般做法为拆点,对于 i 拆为2*i 和 2*i+1,然后连一条流量为1(花费根据题意来定) 的边来控制每个点只能通过一次。额外添加source和sink来控制满流为2。代码都雷同,以HDU3376为例。#include #include #原创 2014-07-23 21:12:15 · 926 阅读 · 0 评论 -
POJ 4046 Sightseeing
最短路的变形,因为要加上最大的原创 2014-07-07 16:10:06 · 717 阅读 · 0 评论 -
有向图的强联通分量 tarjan
多与DAG上的DP之类的问题一起出现。using namespace std;const int MAXE = 300010;const int MAXP = 100010;struct N{ int v,next;}edge[MAXE];int head[MAXP];int Top;int ty[MAXP];int high[MAXP];int low原创 2015-05-15 10:38:45 · 992 阅读 · 0 评论 -
树的重心
拿掉重心后,最大的联通分量的点的个数最少。using namespace std;const int MAXE = 80010;const int MAXP = 40010;struct EDGE{ int v,next;}edge[MAXE];int head[MAXP];int Top;void Link(int u,int v){ edge[Top原创 2015-05-16 08:53:23 · 704 阅读 · 0 评论 -
无向图求桥,允许重复边
#include #include #include #include #include #include #include #include #include #define LL long long#define INF 0x3f3f3f3f#define Mod 1000000007#define Seed1 31#define Seed2 37#define原创 2015-05-15 16:03:17 · 1456 阅读 · 0 评论 -
URAL 1752 Tree 2 树的直径与倍增
假设树的直径的两个端点为p0,p1。如果对于一次询问(v,k)存在点q满足要求,那么q必然在v到p0或v到p1的路径上。剩下的就是在树上寻找p了。倍增就好了。#include #include #include #include #include #include #include #include #include #define LL long long#defi原创 2015-04-16 16:14:49 · 995 阅读 · 0 评论 -
POJ 1637 Sightseeing tour混合欧拉图的判定
网络流简直爆炸了。以下解释转自kuangbin博客,爆炸了。【混合图】混合图(既有有向边又有无向边的图)中欧拉环、欧拉路径的判定需要借助网络流!(1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定不存在欧拉环或欧拉路径(不考虑度数为0的点)。其实,难点在于图中的无向边,需要对所有的无向边定向(指定一个方向,使之变为有向边),使整个图变成一个有向欧拉原创 2015-04-03 19:29:52 · 698 阅读 · 0 评论 -
Codeforce 505D - Mr. Kitayuta's Technology 弱联通分量+拓扑排序
对于有向图M,若将其所有的边转化为无向边,则得到其基图M‘,若M’是联通的,则称有向图M是弱联通。对于有向图M,若图中任意两点u,v(u != v)均满足u到v可达,v到u可达,则称此图为强联通。根据以上定义显然可知,强联通图一定也满足弱联通。此题首先我们需要找到其所有的弱联通分量。对于每一个弱联通分量,设此弱联通分量内点的个数为ans,如果此联通分量无环,则需要的边数为ans原创 2015-01-20 17:14:01 · 1737 阅读 · 0 评论 -
498C - Array and Operations 质因子分解+最大流
题目中说每一个good pair 都满足(u+v)%2 == 1,即一个奇数,一个偶数。首先我们要拿出一原点S,汇点T,S联到所有的num[odd]的质因子上,T联到所有的num[even]的质因子上,边的流量为num[i]中相应质因子的个数。再根据给出的,假设u为奇数,则从u的质因子上联到相等的v的质因子上,流量为INF。丢到模板里跑一遍就好了。#include #includ原创 2015-01-17 15:30:14 · 941 阅读 · 0 评论 -
面积并问题 HDU 1542 Atlantis
HDU 1542 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1542题目大意就是几个矩形相交,然后求出总的覆盖面积,覆盖多次的按一次算。典型的面积并问题。大体思路: 记录所给的点,排序,去掉重复的点,对点编号,可以理解成存放点的数组的下表即为编号。 对Y轴建立线段树,利用线段树计算面积。 AC_code:原创 2013-09-18 15:20:41 · 702 阅读 · 0 评论 -
POJ 1659 Frogs' Neighborhood Havel-Hakimi定理判断可图
1,Havel-Hakimi定理主要用来判定一个给定的序列是否是可图的。2,首先介绍一下度序列:若把图 G 所有顶点的度数排成一个序列 S,则称 S 为图 G 的度序列。3,一个非负整数组成的有限序列如果是某个无向图的序列,则称该序列是可图的。4,判定过程:(1)按降序排序,进入步骤(2)。(2)将第[2,2+s[1]-1]全部减1,若出现负数则不可图,判定结束。若[2,2+s[1原创 2014-11-07 15:43:49 · 684 阅读 · 0 评论 -
网络流小结
第一个问题:在原图无负环的前提上,为什么增广时的最短路算法不会陷入负环,即为什么增广后的残图不会出现负环?其实这是一个很浅显的问题,可是我纠结了好长时间,233。首先假设残图会出现负环,则其出现负环的原因必然是增广后某些反向弧被加入的残图中。而增广路肯定是无环的,所以这些反向弧只可能是负环的一部分。设这些反向弧组成的路径为P,P上各反向弧对应的边组成的路径为P',负环的原创 2014-07-09 00:14:21 · 1009 阅读 · 0 评论 -
HDU 2444 The Accomodation of Students 判断是否为二分图,二分图的最大匹配
题意:问给出的图是不是二分图,如果是输出最大匹配,不是输出"No"。可以利用BFS对图染色来判断一个图是否为二分图。首先图上各节点为无色的,任选一个未染色节点将其染上红色,然后以该点为原点进行BFS。从队列中取出点P,若P为红色,则将与其直接相连的点染上蓝色,否则染上红色。若与P直接相连的点已染色且与P颜色相同,则此图存在奇回路,即不是二分图,BFS终止。若直到所有点均原创 2013-12-27 15:38:41 · 1109 阅读 · 0 评论 -
POJ 3020 / POJ 3041 关于二分图最大匹配的一些变形
其实这两个题早就过了,本想着等看完KM算法一块发的,可是最近一直在忙考试和CF,迟迟没写出来,感觉再拖下去这两个就要忘了,所以还是先发出来吧。POJ 3020 二分图的最小顶点覆盖 等于 最大匹配定义:设K为G的一部分的点的集合,若图G中的每一条边至少有一个顶点在K中,则称K为G的一点顶点覆盖。 若G中不存在满足|K'| 设G为二分图,M为G的最大匹配原创 2013-12-31 21:05:50 · 981 阅读 · 0 评论 -
SDUT 2493 Constructing Roads 最短路
题意:给定一个无向图,N个点,M条边,有一个天使可以让其中的一条边的权值减半。求最短路。解题思路:用两次最短路算法,dis1和dis2存储的分别为s和e到其他点的权值未减半前的最短路。然后枚举每条边就可以了。Min_Cost = Min(Min_Cost,dis1[edge[i].u] + edge[i].w/2 + dis2[edge[i].v]);#include #incl原创 2013-11-08 10:33:29 · 1143 阅读 · 3 评论 -
POJ2253 Frogger
求最长路中的最短路……略显绕嘴 最长路定义为该条路上青蛙调的最远的那一步。应该算是水题,感觉思路比较新颖,主要是权值的定义。 两种算法 很显然 后一种从效率上明显优于前一种 Floyd 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include原创 2013-09-18 15:21:08 · 543 阅读 · 0 评论 -
HDU 1009 The Shortest Path in Nya Graph
迪杰斯特拉 + 优先队列 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 #define LL __int64 10 11 const LL INF = 2000000000; 12原创 2013-09-18 15:22:27 · 752 阅读 · 0 评论 -
POJ 3687 Labeling Balls
题意:有N个球 给出一些轻重关系 排除拓扑序列 若拓扑排序不唯一 则尽量让序号小的轻。输出为该球在拓扑排序中的位置。 解题思路:让入度为零的点进栈,若存在多个入度为零的点,则选取编号最大的。 不会的时候难了一13,会了就感觉水了一13。。。。 1 #include 2 #include 3 #include 4 #include原创 2013-09-18 15:21:18 · 729 阅读 · 0 评论 -
哈夫曼树 SDUT 2127
链接 :http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2127&cid=1184 AC code 130ms 和优先队列还是有一定差距的 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7原创 2013-09-18 15:20:56 · 673 阅读 · 0 评论 -
POJ1789 Truck History 最小生成树 + 路径压缩
首先要强调一点 这不是一道ACM题,这是他妹的一道英语阅读理解。 题意:输入N 代表有N种汽车。每两种汽车之间有一条边,边的权值的定义为 两串字符串之间有几个不同的字母。。。稠密图。。。。普利姆 或者 克鲁斯卡尔 + 路径压缩 我认为后者能通吃所以很无耻的不会第一种。。。。。 1 #include 2 #include 3 #include 4原创 2013-09-18 15:21:11 · 661 阅读 · 0 评论 -
POJ 3026 Borg Maze 普利姆 + BFS
题意:一群人在地图上走啊走 每走到一个 ‘S’ 或者 ‘A’ 就可以分开一次 最多分成四个小队(因为只有四个方向可以走),直到找到所有的‘A’,输出能找到所有‘A’的最小的步数。 注意,新的小队的移动次数从0开始计算。 显然,最小生成树算法。每一组相邻的'A'都可以看成是一个整体,这些独立的整体组成了一个图,在这个图上选取一个最小生成树,这颗最小生成树的边的权值之和即为答案。原创 2013-09-18 15:21:13 · 581 阅读 · 0 评论 -
POJ 2418 Hardwood Species
字典树 或者 map...... map 8000+ ms 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include string>10 #include 11 #inclu原创 2013-09-18 15:21:41 · 742 阅读 · 0 评论 -
HDU 1264 Counting Squares
题意就是给你多个矩形,然后算出这些矩形所框出来的总面积,框过多次的按一次算。 但是题目给的是二维的,线段树只是解决一维的问题比较简单。题目数据范围为0~100,所以我就建了一百棵线段树,这样就可以转化成一维的问题来解决了。-_-|| 结果跑了70+ms 不知道还能再怎么优化……HDU里面有好多0ms的大神…… 1 #include 2 #include 3原创 2013-09-18 15:20:39 · 688 阅读 · 0 评论 -
HDU1754 I Hate It 点修改 区间查询 模板题
1 #include //大白书上说节点数最多有2*n-1个 n为区间长度 2 #include //这个题开420000的数组却RE了 换成100W+就过了……sad 3 #include 4 #include 5 #include 6 7 8 using namespace std; 9 10 int st[1048576];原创 2013-09-18 15:20:36 · 682 阅读 · 0 评论 -
POJ 1611 The Suspects
简单的并查集的应用,统计和 0 联通的点的个数,约等于模板题。。。。。。手残没有判断两个点的根节点是否相等。。。。。贡献了五个WA...... 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 int stu[30010],num[30010]; 8 9 int fin原创 2013-09-18 15:21:26 · 641 阅读 · 0 评论 -
POJ 1062 昂贵的聘礼
SPFA 第二次用到 超级源点 这个概念,依稀记得第一次用还是小时候...... 逆向建图,添加超级源的时候是顺向建立。 0号点为超级源。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include原创 2013-09-18 15:21:06 · 722 阅读 · 0 评论 -
POJ 3259 Wormholes
这个题意 就是利用虫洞时光倒流,题目中给出的虫洞史有向边!SPFA水过~~这个跑了204ms 第一次写 应该是邻接矩阵的缘故……sad 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 const int INF = (120); 8 9原创 2013-09-18 15:20:18 · 564 阅读 · 0 评论 -
POJ 2828 Buy Tickets
树的中序遍历,具体思路见代码。。。原创 2013-09-27 19:49:55 · 676 阅读 · 0 评论 -
POJ 1027 The Same Game BFS
没有什么技术含量的BFS,因为在数量相同的情况下要优先选择左边的,其次是下面的。所以找的时候要从最左边的一列开始,每一列从下面开始。#include #include #include #include #include #include #include using namespace std;struct N{ int x,y,clu;}re;str原创 2013-10-07 14:07:34 · 997 阅读 · 0 评论