图论
文章平均质量分 71
ok_again
起步级菜鸟
展开
-
hdu 1285 确定比赛名次(拓扑)
拓扑排序,然后输出最小字典序。#include #include #include #include #include #include #include #include #include #include #define PI acos(-1.0)#define INF 0x3f3f3f3f#define E exp(double(1))#define MAXN原创 2014-03-10 11:17:09 · 854 阅读 · 0 评论 -
带路径最大点权最短路
碰到了一个有趣的面试题。给定一个图,有边权和点权。让求任意两点间最短路:边权和+路径最大点权。分析:如果枚举最大点权的话,那么每次对于枚举的最大点权建图,跑Floyd就好了。但是这样显然并不好。考虑某个点作为路径中的点。那么显然比他小的点都在图中。然后只需要求该点到任意点的最短路。那么通过这个点,并且以这个点作为最大点权的最短路距离就都求出来了。于是。答案:枚举每个点作为起原创 2017-07-27 21:52:29 · 1972 阅读 · 0 评论 -
Gym 100962F Frank Sinatra
树上莫队。关于树上莫队,需要做的是把树分块。可以直接按dfs序分块,但是这样速度比较慢。还有一种就是按后序遍历的方法去分块。这样就可以按左端点的块号排序,再按右端点的dfs序排序,然后上莫队了。还需要注意的是转移。需要的是每次把链给变掉,这个可以用两端点的变化来搞定。链的异或操作,可以实现链的转换。这道题题意是,给一棵树,然后每条边有边权。给你q个查询,每个查询问你一条链上最小原创 2016-05-12 13:18:48 · 679 阅读 · 0 评论 -
hdu 5383 Yu-Gi-Oh!(最大费用费用流)
建二分图,然后对于所有新产生的Synchro Monster如果比组合前atk高,就连相应的边。然后因为题目要求的是最大费用(负数边权的最小费用),并不用最大流。所以跑费用流的时候,当费用变大的时候就停止增光。//#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include原创 2015-08-14 15:55:58 · 883 阅读 · 0 评论 -
zoj 3820 Building Fire Stations(树上乱搞)
做同步赛的时候想偏了,状态总是时好时坏,这状态去区域赛果断得GG了。题目大意:给一棵树,让求出树上两个点,使得别的点到两个点较近的点的距离最大值最小。赛后用O(n)的算法搞了搞,其实这道题不算难。逗逼的没A。。其实这两个点一定是树直径上的两个点,如果能想到这个就很好搞了,只需要求出树的直径,然后从中间位置把树拆成两颗子树,然后分别求出子树的中心就好了。证明如下,假如我们已经求出树上原创 2014-10-13 13:16:14 · 1655 阅读 · 0 评论 -
无向图最小割
/*最小割集◎Stoer-Wagner算法:一个无向连通网络,去掉一个边集可以使其变成两个连通分量则这个边集就是割集;最小割集当然就权和最小的割集。prim算法不仅仅可以求最小生成树,也可以求“最大生成树”。最小割集Stoer-Wagner算法就是典型的应用实例。求解最小割集普遍采用Stoer-Wagner算法,不提供此算法证明和代码,只提供算法思路:1.min=MAXINT,固定一个顶点转载 2014-06-01 19:49:05 · 902 阅读 · 0 评论 -
poj 1637 Sightseeing tour(混合图欧拉回路)
混合图判断欧拉回路需要转换为网络流问题,首先把无向边当作有向边,然后对于每个点,如果存在点的入度和出度之差为奇数的话,就肯定不存在欧拉回路。对于都是偶数的情况,我们需要对于入度大于出度的点i,我们需要加一条源点到点i的边,容量为出入度差值的一半(因为只需要改变一半边的方向就可以使得点i满足入度等于出度),对于出度大于入度的边,需要加一条点i到汇点的边,容量为出入度差值的一半。然后对于原来的无向边,原创 2014-04-24 19:21:14 · 1163 阅读 · 0 评论 -
UVALive 6571 It Can Be Arranged
网络流,反向jia原创 2014-04-06 19:22:22 · 938 阅读 · 0 评论 -
UVALive 3713 Astronauts(2SAT)
当u, v 年龄段一样时,假设都大于平均年龄,必须满足u=A&&v=C || u=C&&v=A,我们只要加(u=A||v=A) &&(u=C||v=C)两个条件就可以了。而当年龄段不同时只加,(u=A||v=B)这个条件就可以了。 #include#include#include#include#include#include#include#include#include#原创 2014-04-02 10:58:44 · 844 阅读 · 0 评论 -
hdu 4494 Teamwork (可行流的最小流)
去年通话邀请赛的B题,当时竟然过的那么少。。。明明是一道很裸的可行流最小流麽。。只要对每种人分别求一下可行最小流加起来就可以了。建图是对每个点拆点,容量上下届都设为v[i],然后每个点间能连边的直接连边就可以了。然后在这个图的基础上转化为可行流最小流,求一下就可以了。。。#include#include#include#include#include#include#inclu原创 2014-05-02 13:32:32 · 1400 阅读 · 0 评论 -
poj 2396 Budget(可行流)
直接按求可行流的方法建图,然后求一遍最大流,判断一下就可以了。。#include#include#include#include#include#include#include#include#include#include#define LL long long#define CLR(a, b) memset(a, b, sizeof(a))using namesp原创 2014-04-16 14:22:28 · 1058 阅读 · 0 评论 -
图论模板
转自:yang_bro//无向图求割点int pre[maxn], low[maxn], dfs_clock;vector G[maxn];int iscut[maxn];int dfs(int u, int fa) //求出所有点i是否为割点iscut[i]{ int lowu = pre[u] = ++dfs_clock; int child = 0转载 2014-03-09 19:41:54 · 1149 阅读 · 0 评论 -
Uva 1306 The K-League
网络流。枚举每个队夺冠。设win为夺冠赢得场数,那么显然别的队赢得次数都不能超过win。于是我们可以从源点s向每个队u(除了当前枚举的队)加边,容量为win-w[i],即该队还能赢多少场,然后再从从该队向节点(u,v)连边,容量为a[u][v]表示u和v比最多赢a[u][v]场,最后从节点(u, v) 向汇点t连边,容量为a[u][v],表示这个节点最多能产生a[u][v]场胜利。如果最大流等于所原创 2014-03-28 19:16:54 · 891 阅读 · 0 评论 -
Uvalive 2957 Bring Them There
拆点网络流,方法很巧妙。#include#include#include#include#include#include#include#include#include#include#include#define LL long long#define CLR(a, b) memset(a, b, sizeof(a))using namespace std;co原创 2014-03-28 17:37:04 · 783 阅读 · 0 评论 -
Uva 11248 Frequency Hopping
因为要求的是只能修改一条弧,所以必定是修改最小割中的弧,于是枚举割做最大流。RujiaLiu给了两个优化。。 1.求完最大流后把流量留着,以后每次在它的基础上增广。 2.每次没必要求出最大流,增广到流量至少为C时就停下来就可以了。Dinic模板:#include#include#include#include#include原创 2014-03-28 14:40:03 · 693 阅读 · 0 评论 -
hdu 1043 Eight(八数码)
A*解法:#include#include#include#include#include#include#include#include#include#include#define maxn 100100#define CLR(a, b) memset(a, b, sizeof(a))using namespace std;const int N = 40000原创 2014-03-16 19:52:36 · 744 阅读 · 0 评论 -
图论新结
无向图最大流(最小割):原创 2014-06-01 20:02:16 · 854 阅读 · 0 评论