ACM.图论
slowlight93
这个作者很懒,什么都没留下…
展开
-
zoj-1092-Arbitrage
/*ID:slowlightPROG:ArbitrageLANG:C++DATE:2013-9-5*/#include #include #include #include #include #include #include using namespace std;typedef struct{ int name; floa原创 2013-09-05 20:39:34 · 585 阅读 · 0 评论 -
poj 2516 Minimum Cost(最小费用流基础)
题意: 。。。 思路: 这里是求最大流的最小费用流。 k个物品是无关的,可以分开搞,最后把费用加起来。 参考了大神代码const int Maxn = 50;const int MaxV = 105;struct Edge { int to, cap, cost;};vector<Edge> E;vector<int> G[MaxV+5];int offer[Maxn+5]原创 2015-03-25 22:49:02 · 415 阅读 · 0 评论 -
poj 3436 ACM Computer Factory(最大流基础,拆点)
题意: 产品有p个部分。 有n台机器, 用生产速率,接受列表,输出列表描述。 连接这n台机器,使得总生产速率最大。 思路: 把每台机器拆成,入点和出点,容量为生产速率。 然后添加超级源点和汇点。const int inf = INT_MAX/2;const int Maxn = 100000;const int MaxV = 200;struct Edge { int to原创 2015-03-25 01:50:02 · 597 阅读 · 0 评论 -
【图论小结】
图的保存边的表示// 适用于一般情况的边的表示// 根据不同的情况有不同的变体struct Edge { int from, to, cost;}邻接矩阵d[from][to]=costd[from][to] = cost 最简单的方式,适用于密集图 缺点:内存消耗是O(V2)O(V^2),点太多会存不下静态邻接表貌似有很多称呼,我觉得还是这个比较贴切。 优势: 直接访问从某个原创 2015-03-26 00:05:23 · 433 阅读 · 0 评论 -
poj 3281 Dining(最大流基础,拆点)
题意: 。。。 思路: 因为food和drink要么同时要,要不都不要,则需要把它们串起来,牛放中间 对牛进行拆点以限制每头牛吃了一份food,和一份drinkconst int inf = INT_MAX/2;const int Maxn = 100000;const int MaxV = 500;struct Edge { int to, cap, rev;};vecto原创 2015-03-25 22:39:14 · 497 阅读 · 0 评论 -
poj 2677 Tour(双调环游, bitonic tsp)
题意: 。。。 思路: 。。。double solve() { f[1][0] = d[1][0]; rep(i, 2, n-1) { rep(j, 0, i-2) { f[i][j] = f[i-1][j] + d[i][i-1]; } f[i][i-1] = inf; rep(j, 0,原创 2015-03-03 13:13:47 · 582 阅读 · 0 评论 -
poj 1635 Subway tree systems(树的同构,经典)
题意: 一个有根树。给一种用01序列来表示该树的方式,0表示前进(沿没有访问过的边),1表示沿树边回退。 一个树当然会有多种表示, 问题是给出两个序列,问是否表示同一颗树。 思路: 感觉判断树的同构是个很广的问题。 不过就此题而言,可以对一颗树的所有表示序列,都可以用递归的方式把它们变成一个。(先划分子树,按字典序重排) 也有用dp做的,还有哈希的。。是很值得研究的一题 这道题引起我对原创 2015-04-12 01:04:28 · 592 阅读 · 0 评论 -
whuoj 1566 Spanning Tree (动态MST,简单)
题意: G是一个无向连通图。向G中加Q次边,求出每次加边后MST的权值。 思路: 该问题属于“动态最小生成树问题”,关于该问题,有几种高效算法。。 不过,因为这里数据规模不大,我们用稍微暴力一点的方法就能过了。 如果修改了一条原本不在MST中的边的值,或者新加入一条边,那么该边就有可能取代MST中的一条边。 将这条边加入MST中,会得到一个环,去掉环上最大的边,就是新的MST。 证明一原创 2015-04-20 02:21:05 · 868 阅读 · 0 评论 -
srm 299 div2 1000(强连通分量缩点,拓扑)
题意: 空间中有多个粒子碰撞。i,j碰撞有三种情况。 1)nothing happen 2)i disappear 3)j disappear 求最后可以剩下最少的粒子数 思路: 强连通分量最后只能剩下一个,如果外面有边连进来,则全部消失。 所以先求DAG,然后数根的个数。const int Maxn = 50;int vis[Maxn+5];class StrangePartic原创 2015-04-14 11:28:12 · 499 阅读 · 0 评论 -
【北大DS公开课】地震之后(刘朱算法-有向图上求MST)
题目:http://dsalgo.openjudge.cn/dsmoochw8/4/做过这道题后,我明白了为何prime算法不可用于DG上的MST求解,并理解了刘朱算法的思想。感谢Anonymous同学提供了很多有用的资料和Chong Wang同学的提问。(本来第一次做的时候这部分刚刚讲完,也想去提问来着,但想着过几周应该有人会问。。)。相应的帖子链接:https://class.原创 2014-01-05 21:34:01 · 1464 阅读 · 0 评论 -
ZSTUOJ 4191 无向图找环(DFS应用,经典)
题意: 在一个联通的无向图上,判断是否存在边异或值大于0的环。 思路: 觉得蛮经典的一题。很多图论题都要求先来一遍dfs预处理,熟悉这样的性质非常有用。 一开始想到记录从0开始的xor值。 但是,纠结在怎么一次dfs求出多个环的值。。。 实际上,只要记录边的访问状态。在dfs后再枚举边进行判断就ok了。。 (link)[http://oj.acm.zstu.edu.cn/JudgeOn原创 2015-04-14 23:18:35 · 2939 阅读 · 0 评论 -
uva 1670 Kingdom Roadmap(图论构造题)
题意: 给你一颗树, 让你加最少的边使这个图不存在割边。 思路: (在acdream群里看到有人问这个问题, 就去做了。。做完的感想是。。图论构造题是太无解了。。) 很容易猜到答案是 (m+1) / 2 ,m是叶子的个数。 关键是怎么构造? 比如 9 1 2 2 3 3 4 4 5 4 6 2 7 7 8 7 9 从这样的数据可以想到要连一些交叉边。。不过还是想不到科原创 2015-08-08 01:02:56 · 1154 阅读 · 0 评论 -
codeforces 277E - Binary Tree on Plane (MinCostMaxFlow, 简单)
题意: 。。。 思路: 将每个点 u 拆成两个顶点 u-in, u-out, 但不连边。 从s向u-in连边, 容量为2, 限制u的子节点最大为2。 从u-out向t连边, 容量为1, 限制u只有一个父亲。 对 y[u]>y[v]y[u] > y[v], 连一条边 (u, v), cost 为距离。 然后跑 MinCostMaxFlow, 最后check一下是否满流。#include原创 2015-08-01 01:21:28 · 773 阅读 · 0 评论 -
【算法笔记】总结 - 网络流 Edmonds-Karp 算法和 dinic 算法
边的表示1) 如果要把边单独存在一个buffer里面,并且每条边有一个唯一的编号。 那么通常将正反边存在一起,比如0,1,这样就可以用 id^1 来方便地访问反边了。 2) 也可以对每个节点,存一个 vector<Edge> 其中 rev 是在 to 节点的邻边列表中的编号。 可以只用 cap 记录剩余容量,这样就省掉 flow 了。struct Edge { int to, c原创 2015-07-22 02:21:29 · 1620 阅读 · 0 评论 -
poj 1087 A Plug for UNIX(最大流基础)
题意: 。。。 思路: 这也是一道二分匹配,不过用最大流解法简单了很多。 建图时注意,适配器是无限的,所以容量为inf。const int inf = INT_MAX/2;const int Maxn = 100000;const int MaxV = 700;struct Edge { int to, cap, rev;};vector<Edge> G[MaxV+5];i原创 2015-03-25 22:43:25 · 427 阅读 · 0 评论 -
POJ 3169 Layout(差分约束基础)
题意: 。。。 思路: 1)不等式 题目中有两类不等式,b-a<=c 和 b - a >= c ( id(a)<id(b) ) 把后者换成a-b<=-c,然后求从1开始的最短路。如果d[n]=inf, 则说明(1, n)不存在小于等于的约束关系。 2) 判负环 因为1可能到不了负环,所以首先要把全部节点入队,然后跑一遍spfa来判断。struct Edge{ int nxt,原创 2015-02-20 15:29:19 · 361 阅读 · 0 评论 -
POJ-1469(二分图匹配)
练习匈牙利算法原创 2014-06-17 16:34:06 · 559 阅读 · 0 评论 -
SOJ 12259 Message Relay (dfs,图联通)
题意:找出一个有向图中的环以及进入环的点。。()原创 2014-11-19 12:47:29 · 580 阅读 · 0 评论 -
hdu 2819 Swap(二分图匹配)
左边的点集是行标号,右边的点集原创 2014-11-02 20:58:06 · 487 阅读 · 0 评论 -
SOJ 12261 Milk Scheduling
题意:求拓扑结构中的最长路径用删除原创 2014-11-19 12:52:33 · 619 阅读 · 0 评论 -
codeforces 500D New Year Santa Network (树结构, 组合, 概率(注意精度))
题意:给了一颗树,和它的边权。。然后给若干修改,每次改一条边的权值。。问题是,每次修改后随机找三个不同的点,求 E( d(a, b)+d(a, c)+d(b, c)) 。。。思路:如果是随机选两个点,就好办得多了。我们让1作为root, 如果 (u, v) 修改后变化了 d, 那么它对总权值的贡献是 size(k)*(n-size(k))*d, k = size(u) size(原创 2015-01-17 18:25:02 · 848 阅读 · 0 评论 -
hdu 3072 Intelligence System (强连通,缩点)
题意:给一个有向图,将SCC缩点后得到DAG,求一颗根为0的“有向最小生成树”,使0到其他各个顶点的费用和最小。思路:先kosaraju算法求SCC。所求的“树”,是连接两个不同的连通分量的边集的子集。于是按照连通分量的topo顺序,枚举一下即可。//#include#include #include #include #include #include原创 2015-02-05 21:18:48 · 378 阅读 · 0 评论 -
POJ 2186 Popular Cows(强连通,kosaraju算法)
题意:有m个有序对,且满足传递性。求解满足以下性质的点的个数,从其他每个点都可以通过有向边到达该点。思路:如果A, B都满足性质,则A,B至少在一个有向环上,所以满足性质的点属于同一连通分量。我们可以用双向dfs算法求出SCC,并且从最后一个连通分量拿一个元素来检查是否可以沿着反图访问到每个点。//#include#include #include #include #in原创 2015-02-05 17:27:54 · 420 阅读 · 0 评论 -
POJ 3660 Cow Contest
题意: 给出m个偏序关系。 求与其他点都存在关系的点的数目(aRb或bRa满足其一) 思路: Floyd求出所有存在的关系,然后判断。。int solve() { rep (k, 1, n) rep (i, 1, n) rep (j, 1, n) if (i!=j && f[i][k] && f[k][j]) f原创 2015-02-18 00:06:09 · 411 阅读 · 0 评论 -
POJ 1062 昂贵的聘礼(最短路+枚举)
题意: 2015新年第一A ^_^ 新的一年里Fight on!!祝Mission Success!!! 。。 思路: 建图:task作节点,并且增加一个虚拟节点0,表示一个任务都没有完成的初始状态。i直接费用是从0到i的边,间接费用是从其他点到i的边。。 枚举:枚举所有[i, i+m]的区间就好,min(i) = max (0, lv[1]-m)//#include<bits/stdc+原创 2015-02-19 00:51:39 · 444 阅读 · 0 评论 -
POJ 1860 Currency Exchange(求环变形)
题意: 。。。 思路: Bellman-ford判环//#include<bits/stdc++.h>#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <vector>#include <queue>#include <stack>#include <cassert>原创 2015-02-19 13:49:46 · 480 阅读 · 0 评论 -
POJ 1201 Intervals(差分约束基础)
题意: 。。。 思路: 差分约束的知识详见《算法导论》24.4 “差分约束和最短路径”1)变量: 用s[i]表示[0, i]中数的个数,特别的,s[-1] = 0 设最大的区间端点是maxnum,那么总共有maxnum+2个变量(也就是图上的节点),s[-1],s[0]…s[maxnum]。 2)隐含的约束: 1>=s[i]−s[i−1]>=01>=s[i]-s[i-1]>=0 3)原创 2015-02-20 13:37:57 · 448 阅读 · 0 评论 -
POJ 2240 Arbitrage (有向图求环)
题意: 套利。。 题目中貌似有自环,比较坑。。 思路: 1)Floyd,初始化:f(i, j) = i==j ? 1.0 : 0int solve() { rep(k, 1, n) rep(i, 1, n) rep(j, 1, n) if (f[i][k]*f[k][j] > f[i][j])原创 2015-02-17 22:57:15 · 746 阅读 · 0 评论 -
codeforces 515D Drazil and Tiles
题意: 类似骨牌覆盖。在n*m的格子上有一些不能放的格子。 询问是否有唯一的方法用1x2的牌覆盖地图。 思路: 建图:如果两个空格相邻,则连一条边。并计算每个格的度数。 然后用类似删源点法的方法不断删去度为1的格子和它的邻居。 如果最后有剩下的格子可以证明边是可二着色的(必然偶环?)#include<bits/stdc++.h>using namespace std;#define S原创 2015-02-18 22:59:34 · 536 阅读 · 0 评论 -
【算法笔记】最短路总结
次短路目前只会用dijstra求解。。(貌似有用spfa的。。 当然如果是DAG, 拓扑排序加DP也是可以的。。次短路的求解和计数hdu 3191这道题有边权为0的情况。 dij所使用的贪心性质:S是目标集合(已经求得最短路或次短路的点),从 V - S 中选估计值最小的一个u,那么d[u]d[u]就是u的最短路长度。 如果边权有0存在, 那么这条性质就无法保证了。。 幸而数据比较特殊, 只原创 2015-08-05 12:29:54 · 579 阅读 · 0 评论