
图论
文章平均质量分 79
constbh
这个作者很懒,什么都没留下…
展开
-
hdu4435(思维)
There are n cities in M^3's empire. M^3 owns a palace and a car and the palace resides in city 1. One day, she wants to travel around all the cities from her palace and finally back to her home. Howev原创 2017-11-28 11:07:52 · 282 阅读 · 0 评论 -
poj1637(混合图判欧拉回路)
把该图的无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路。 好了,现在每个点入度和出度之差均为偶数。那么将这个偶数除以 2,得 x。也就是说,对于每一个点,只要将 x 条边改变方向(入>出就是变入,出>入就是9变出),就能保证出=入。如果每个点都原创 2017-09-11 20:46:56 · 337 阅读 · 0 评论 -
poj 3613(还是不懂,以后再看看)
题意:给定一个T(2 以前一直没仔细想过floyd算法,觉得很简单,今天做这题的时候,看网上的报告都有一句:floyd是每次使用一个中间点k去更新i,j之间的距离,那么更新成功表示i,j之间恰有一个点k时的最短路,如果做N - 1次floyd那么不就是i,j之间借助N - 1 个点时的最短路了。看了很久不明白为什么。也对floyd的最外围的那个k回到这题,floyd算法是对自身矩阵更新转载 2017-09-02 19:12:47 · 211 阅读 · 0 评论 -
woj1124(网络流好题)
【题目大意】有 N 支球队,互相之间已经进行了一些比赛,还剩下 M 场没有比。现在给出各支球队目前的总分以及还剩下哪 M 场没有比,问能否合理安排这 M 场比赛的结果,使得第 N 支球队最后的总分大于其他任何一支球队的总分。已知每场比赛胜者得 2 分,败者 0 分,平局则各得 1 分。(1 【建模方法】首先,所有跟球队 N 相关的比赛都要让球队 N 赢。如果此时仍有某支球队的总分大于等原创 2017-09-11 16:46:17 · 449 阅读 · 0 评论 -
poj 3160 (强连通缩点&简单dp)
Flymouse从武汉大学ACM集训队退役后,做起了志愿者,在圣诞节来临时,Flymouse要打扮成圣诞老人给集训队员发放礼物。集训队员住在校园宿舍的不同寝室,为了节省体力,Flymouse决定从某一个寝室出发,沿着有向路一个接一个的访问寝室并顺便发放礼物,直至能到达的所有寝室走遍为止。对于每一个寝室他可以经过无数次但是只能进入一次,进入房间会得到一个数值(数值可正可负),他想知道他能获得最大的数原创 2017-09-02 09:48:27 · 412 阅读 · 0 评论 -
poj 3037
速度在原点是恒定的,所以每个点的速度也能直接算出来,然后最短时间是就最短路。迪杰斯特拉的时候 INF要开足够大,要不然会wa#include#include#include#include#include#includeusing namespace std;const int maxn = 105;const double inf = (1<<20)*1.0;int原创 2017-09-01 15:47:15 · 259 阅读 · 0 评论 -
918知道了几个新的概念
最小支配集:对于图G=(V,E)来说,最小支配集指的是从V中尽量取少的点组成一个集合,使得V中剩余的点都与取出来的点有边相连。设V1是图G的一个支配集,则对于图中的任意一个顶点u,要么属于集合V1,要么与V1中的点相邻。在V1中去除任何一个元素后V1不在是支配集,则V是图G的最小支配集。最小点覆盖:对于图G=(V,E)来说,最小点覆盖指的是从V中取尽量少的点组成一个集合,使得E中所有边原创 2017-09-18 16:36:55 · 399 阅读 · 0 评论 -
hoj2713(最小点权覆盖)
经典的最大点权独立集问题。转化为最小点权覆盖集:先将网格黑白染色,从源点到每个黑点有一条边,从每个白点到汇点有一条边,容量均为相应宝石的价值。每个黑点向与其相邻的四个白点连边,容量为∞。设最小割为 ans,结果即为∑Cij – ans#include#include#includeusing namespace std;typedef int cap_type;#de原创 2017-09-18 16:34:41 · 503 阅读 · 0 评论 -
loj#526. 「LibreOJ β Round #4」子集
给N个点,给出建边的条件,求图中的最大团,直接跑最大团模板会超时,建个对偶图,跑二分图匹配,最大团子集中点的个数就是n-匹配数#include#includeusing namespace std;const int maxn = 505;int n;long long num[maxn];int match[maxn];int vis[maxn];int bmap[maxn]原创 2017-09-06 10:46:22 · 447 阅读 · 0 评论 -
hdu1281(二分图匹配)
//把行和列变成点,能放的点就把行和列连起来 //求二分图最大匹配就是最多能放的棋子数,这 //还是比较基础的,但是在于怎么求相同的点的 //个数,因为每一条边相当于一个点,我们可以 //枚举删除每一条边,看二分图匹配的值是否会变 #include#include#includeusing namespace std;int n,m;int bmap[105原创 2017-09-05 21:56:28 · 264 阅读 · 0 评论 -
SGU326(最大流)
同样,所有和球队 1 相关的比赛全让球队 1 赢,如果此时仍有某支球队胜利的场数大于球队 1,则已经不可能满足要求。按如下方法建图:所有小组内的比赛 i(不包括与球队 1 相关的比赛)作为一个点并加边(s, i, num[i]),每支球队(不包括球队 1)作为一个点并加边(j, t, wins[1]-wins[i]),每场比赛向与其关联的两支球队 u, v 连边(i, u, ∞),原创 2017-09-13 17:14:33 · 443 阅读 · 0 评论 -
UVA 11183 (最小树形图)
一道最小树形图模板题,学习了一下http://hi.baidu.com/lydrainbowcat/item/5fbae3fb9c159c5ec8f33753以下转自该博客:题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图。最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小。题目算法:朱-原创 2017-09-05 17:49:36 · 264 阅读 · 0 评论 -
poj1815(最小割点集)
【题目大意】现代社会人们都靠电话通信。A 与 B 能通信当且仅当 A 知道 B 的电话号或者 A知道 C 的电话号且 C 与 B 能通信。若 A 知道 B 的电话号,那么 B 也知道 A 的电话号。然而不好的事情总是会发生在某些人身上,比如他的电话本丢了,同时他又换了电话号,导致他跟所有人失去了联系。现在给定 N 个人之间的通信关系以及特定的两个人 S 和 T,问最少几个人发生原创 2017-09-19 23:30:57 · 873 阅读 · 0 评论 -
hdu6201(无向图最长路)
设置一个虚拟起点和虚拟终点,每个点与起点间一条负边,值为这个点书的价值的相反数(代表买书花钱),每个点与终点连一条正边,值为这个点的书的价格(代表卖书赚钱)。然后按照图中给的边建无向边,权值为负(代表路费)。然后就是跑最长路,spfa改一下松弛条件就行#include#include#include#includeusing namespace std;const int maxn原创 2017-09-12 21:26:14 · 2343 阅读 · 1 评论 -
vijos1094(差分约束系统)
描述给出一有向图,图中每条边都被标上了关系运算符‘’,‘=’。现在要给图中每个顶点标上一个大于等于0,小于等于k的某个整数使所有边上的符号得到满足。若存在这样的k,则求最小的k,若任何k都无法满足则输出NO。例如下表中最小的k为2。结点1>结点2结点2>结点3结点2>结点4结点3=结点4如果存在这样的k,输出最小的k值;否则输出‘NO’。格式输入格式共二行,原创 2017-11-21 21:27:49 · 302 阅读 · 0 评论 -
热爱工作的蒜蒜(带限制最短路)
众所周知,蒜蒜是一名热爱工作的好员工,他觉得时间就是金钱,做事情总是争分夺秒。这天晚上,蒜蒜一个人去吃晚饭。不巧的是,吃完饭以后就开始下雨了,蒜蒜并没有带雨伞出来。但是蒜蒜热爱工作,工作使他快乐,他要尽快赶回去写代码。蒜蒜的公司在中关村,中关村这边地形复杂,有很多天桥、地下通道和马路交错在一起。其中,地下通道是可以避雨的,天桥和马路都没办法避。可以把中关村抽象成为 nnn 个点的地原创 2017-10-25 21:05:19 · 355 阅读 · 0 评论 -
uvalive5713(次小生成树)
先求出最小生成树,然后n^2枚举两个点,在两个点之间连一条边,就形成了一个环,然后求出两点间人数的和除以那个环在树上的边的最大边,更新最大值.求最大权值边可以用熟练剖分.复杂度n^2logn.#include #include #include #include#include using namespace std;#define Del(a,b) memset(a,b,size原创 2017-10-22 11:36:43 · 314 阅读 · 0 评论 -
poj3867(2-sat)
题目大意: 给了N个点和M条边,每个点的权值可以是0可以是1,M条边有一个边权和一个操作,问是否存在一个点权赋值方式,满足m条边的两个端点的权值通过该边的操作和该边的权值相等。挑战上经典的2-sat问题。列出一个真值表,看着建图就行了。#include#include#include#includeusing namespace std;con原创 2017-10-11 19:38:29 · 268 阅读 · 0 评论 -
hdu3622(二分&2-sat)
二分答案,若距离冲突(dist【i】【j】代码来自匡斌/*HDU 3622题意:给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸的范围半径都一样,控制爆炸的半径使得所有的爆炸范围都不相交(可以相切),求解这个最大半径. 首先二分最大半径值,然后2-sat构图判断其可行性,对于每 两队位置(u,原创 2017-10-09 20:55:46 · 219 阅读 · 0 评论 -
spoj371(费用流)
一个比较直观的想法是每个盒子 i 作为一个点。若 Ai > 1 则连边(s, i, Ai-1, 0);若Ai = 0 则连边(i, t, 1, 0)。对任意两个盒子 i, j,若 Ai > 1 并且 Aj = 0,连边(i, j, ∞, min(|i - j|, n - |i - j|))。求一次最小费用流即为结果。但是这样构图复杂度会很高,边数会达到 O(N^2),不够聪明。更加简洁原创 2017-09-22 11:46:30 · 252 阅读 · 0 评论 -
codeforces730J(费用流)
每个人与源点连一条边,流量是1,费用为0.每个人与编程队那个点连一条边,流量是p,费用为-a[i];每个人与运动队那个点连一条边,流量是s,费用为-b[i];编程队与运动队向汇点连一条边,流量分别为,p,s。费用为0;最大值就是 最小费用的取反。然后遍历边数组,流量不为0 的边并且起点是1-n的,终点是运动队就是运动队的人,是编程队就是编程队的人。#include#inc原创 2017-10-09 16:49:58 · 349 阅读 · 0 评论 -
poj3169(差分约束系统)
题目大意:一些母牛按序号排成一条直线。有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离。如果没有输出-1,如果可以随便排输出-2,否则输出最大的距离。推出公式:b-a然后spfa#include#include#include#includeusing namespace std;int n;const int maxn = 1000+原创 2017-10-09 12:23:52 · 246 阅读 · 0 评论 -
Hoj2739
【题目大意】带权有向图上的中国邮路问题:一名邮递员需要经过每条有向边至少一次,最后回到出发点,一条边多次经过权值要累加,问最小总权值是多少。(2 1 【建模方法】若原图的基图不连通,或者存在某个点的入度或出度为 0 则无解。统计所有点的入度出度之差 Di,对于 Di > 0 的点,加边(s, i, Di, 0);对于 Di 0);对原图中的每条边(i, j),在网络中加原创 2017-09-21 16:43:19 · 321 阅读 · 0 评论 -
poj3680(费用流)
经典构图题。先将所有区间端点离散化到整数 1..M,另加源 s=0,汇 t=M+1;对每个点 i (0 ai’, bi’分别表示 ai, bi 离散化后对应的数值。求一次最小费用流再取反即为结果#include#include#include#includeusing namespace std;#define INF 0x3f3f3f3fconst int maxn原创 2017-09-21 16:42:13 · 319 阅读 · 0 评论 -
poj1724(带限制的最短路)
题意:一个人要从1点到N点,有m条边可以走,走每条边要花一些钱,这个人只有k的钱,问花的钱不多于K且能到N的最短路。spfa解决最短路,不过dist数组要加一维,dist【i】【j】表示从1走到了i花了j钱的最短路。感觉这时候就是个bfs#include#include#include#includeusing namespace std;int n,k;struct no原创 2017-10-08 19:52:10 · 1754 阅读 · 0 评论 -
poj3281(最大流)
【建模方法】此题的建模方法比较有开创性。以往一般都是左边一个点集表示供应并与源相连,右边一个点集表示需求并与汇相连。现在不同了,供应有两种资源,需求仍只有一个群体,怎么办?其实只要仔细思考一下最大流的建模原理,此题的构图也不是那么难想。最大流的正确性依赖于它的每一条 s-t 流都与一种实际方案一一对应。那么此题也需要用 s-t 流将一头牛和它喜欢的食物和饮料“串”起来,而食原创 2017-09-13 11:35:42 · 339 阅读 · 0 评论 -
hdu6166(xjb迪杰斯特拉)
类比cf 835E,枚举二进制位按照标号当前位为1 和当前位为0分为两个集合,每次求解两个集合之间的最短路即可覆盖到所有的点对。时间复杂度20*dijstla时间G++ AC c++会超时。#include#include#include#includeusing namespace std;typedef long long ll;const ll inf = 0x3f3原创 2017-08-22 21:09:57 · 334 阅读 · 0 评论 -
hdu1350
最小路径覆盖。把每个客人当做一个点,如果一辆车从一个点的时间开始到送完这个点在到另一个点的起点坐标加一的时间小于等于另一个点的开始时间,那么这两个点之间连一条边。然后根据最小路劲覆盖等于点数减去最大匹配跑二分图最大匹配,匈牙利算法。#include#include#includeusing namespace std;int m;int sx[505],sy[505],ex[原创 2017-07-24 15:55:20 · 325 阅读 · 0 评论 -
zoj 1015(玹图的判定)
知道了个新概念:玹图https://wenku.baidu.com/view/6f9f2223dd36a32d73758126.html?from=rec&pos=0&weight=9&lastweight=2&count=5##。这个题就是有关玹图的判断。算法看了http://www.cnblogs.com/jianglangcaijin/p/3799696.html这里的完美消原创 2017-08-08 10:13:15 · 323 阅读 · 0 评论 -
hdu(4635)
给一张有向图,问在这张图中最多还能添加多少条边,使得添加完以后图仍然不强连通。tarjan缩点完以后进行乘法技术原理。记录每个强连通分量的入度和出度,只有入度或出度为零的点才可以当做最后被孤立的那个连通分量,其余剩下的所有连通分量全部通过加边变成一个连通块,然后枚举被分出来的那个连通块,更新最大答案。#include#include#include#include#include#i原创 2017-08-08 09:09:47 · 354 阅读 · 0 评论 -
hdu3861
强连通加最小路劲覆盖。#include#include#include#include#includeusing namespace std;int n,m;struct node{ int to; int next; node(){ } node(int a,int b):to(a),next(b){ }}edge[100000*2+10];vectorG[5005原创 2017-07-23 14:42:17 · 210 阅读 · 0 评论 -
hdu 4738(双联通缩点)
此题有坑!!!桥的边权有可能是0,但是这时候要输出1,因为周瑜至少的排一个人去炸呀,那个年代又没有导弹!!!卧槽,有时候还得联系实际!#include#include#include#include#includeusing namespace std;const int inf = 1<<20;const int maxn = 1005;int n,m;struct n原创 2017-08-07 17:54:12 · 221 阅读 · 0 评论 -
hdu 5889 spfa&最小割
用spfa处理处最短路,把多条最短路上的边放到新图里面,跑一遍dinic求最小割。#includeusing namespace std;const int maxn = 2005;#define inf 1e9#define INF 1e9const int maxm = 4000000+50;struct Node{ int v,w; Node(int vv,原创 2017-08-07 16:39:10 · 161 阅读 · 0 评论 -
bzoj 2730
如果没有割点,任意选两个点建立出口。答案是2 C(n,2);如果有割点,用搜索去跑,得出所有的连通块,如果一个连通块与超过1个割点相连,就需要建立一个出口,算有多少种情况 就是乘法计算原理。#include#include#includeusing namespace std;int n,m;struct node{ int to; int next; node()原创 2017-07-18 20:11:00 · 347 阅读 · 0 评论 -
hdu 4034
暴力水题,和弗洛伊德差不多,枚举三个点,之间存在边,如果dist[i][j]==dist[i][k]+dist[k][j],这跳边可以删掉。如果发现大于,就输出impossible。第三重循环找到相等后忘记了break 导致wa。。。。。#includeint dist[105][105];int main(){ int cases,n,t = 1; scanf("%d",&原创 2017-07-21 19:47:33 · 231 阅读 · 0 评论 -
hdu 3986
题目要求删除图上的一条边,使得最短路最长,也可以删边后不可达。先跑一遍最短路,求出不删边时最短路上的所有边。然后枚举删除这些边,再次迪杰斯特拉,每次更新最大值。作为一个菜鸡,这题一A了,然后没出息的笑了笑。上代码#include#include#include#include#includeusing namespace std;const int maxn = 100原创 2017-07-14 16:35:03 · 464 阅读 · 0 评论 -
hdu1535
题目要求计算从1出发到各个点之后在从各个点回到1所花费最小。两遍最短路,第一遍求出1点到所有点的最短距离,第二遍重建反向图,求得1点到所有点距离就是所有点到1点的最短路。#include#include#include#includeusing namespace std;const int inf = 1000000001;int n,m;struct node{ int原创 2017-07-14 14:39:53 · 456 阅读 · 0 评论 -
hdu 1317
最短路存在负环的问题。#include#include#includeusing namespace std;struct node{ int to; int next; int w; node(){ } node(int a,int b,int c):to(a),next(b),w(c){ }}edge[100*100+10];int head[105];int di原创 2017-07-14 11:01:21 · 330 阅读 · 0 评论 -
hdu 3001
求走完全部点所需要的最小花费。因为每个点最多可以经过两次,所以2进制的状态压缩并不满足要求。用三进制状态压缩,每个数位表示第几个点进过了几次,然后开2维dp数组dp[60004][12]。第一维表示每个状态,第二维表示在第一维的状态下最后到达的是哪个点。dp数组的值表示最小花费。剩下的就和普通的图上的状态压缩一样了。注意去掉重边。#include#include#include原创 2017-07-25 09:39:40 · 332 阅读 · 0 评论 -
51Nod 1445(考建图的最短路)
N只有50,跑一下N的平方建图,两种颜色之间的距离就是 他前面的Y的数量,剩下的就是模板了。#include#include#include#include#include#includeusing namespace std;typedef long long ll;typedef pair P;const int maxn = 55;const int inf = 1<原创 2017-08-16 19:33:20 · 238 阅读 · 0 评论