图论/网络流
ConwayTian
一切再来,为时未晚。
毁掉你人生的,其实是你内心的平庸,是你失去追求卓越的那个瞬间。
展开
-
POJ 1149 PIGS (最大流Dinic)
题意:话说一个猪圈管理员,他本身没有猪圈的钥匙。每天会有许多顾客来买猪,这些顾客自己带着某些猪圈的钥匙。每当一个顾客来买猪,这些打开的猪圈里的猪可以随意流动,买完猪之后打开的猪圈全部关闭。现在已知每个猪圈里猪的的数量,每一名顾客拥有的钥匙以及他想购买的猪的数量。求管理员可以卖出的最大数量。题解:构图是难点在于猪的流动。我是这样想的,假设顾客A可以打开了猪圈1,3,5,他需要购买numA头猪原创 2011-10-25 13:26:47 · 957 阅读 · 0 评论 -
POJ 1258 Agri-Net Prim/Kruskal
题意:将n个村庄连接起来,每两个村庄之间连接的消耗已经知道。求将所有村庄连在一起所需要的最小消耗。题解:给出两组代码。Prim:#include#define MAX 300#define INF 99999999int map[MAX][MAX];int dis[MAX], vis[MAX];int Prim ( int n ){ int i,原创 2011-09-09 00:55:16 · 482 阅读 · 0 评论 -
POJ 3041 Asteroids 匈牙利算法/最小点覆盖
题意:给你一个N*N的矩阵,有一些格子里有小行星,现在Bessie有一些威力很大的炮弹,每一次射击都能够消灭掉矩阵中一行或一列的小行星,但是炮弹很贵,问你需要消灭掉所有小行星所需的最小炮弹数目。题解:一道很显然的最小点覆盖的问题,将矩阵中每一个行看成集合A中的一个点,每一列看成集合B中的点如果第i行第j列有小行星则将Ai和Bj连一条边。显然题目要求的就是次二分图的最小点覆盖问题,在二分图中,最原创 2011-09-03 09:53:00 · 613 阅读 · 0 评论 -
POJ 1724 ROADS (有限制的最短路径DFS/BFS)
题意:有n座城市,城市之间有道路,道路需要收费,现在Bob想从城市1去城市n,但是他所拥有的钱是有限制的。现在问Bob能否在有限的钱之内到达n城,若能则输出最短路径。题解:一开始用vector建图,果断TLE··。可能是从尾部添加邻接点的原因吧。#include #include using namespace std;#define N 10005#define原创 2011-10-03 00:40:01 · 1078 阅读 · 0 评论 -
POJ 1062 昂贵的聘礼 Dijkstra
题意:年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的原创 2011-09-09 11:04:16 · 2086 阅读 · 1 评论 -
POJ 3259 Wormholes Bellman-Ford
题意:F代表农场的个数,N代表每一个农场里的区域数,M代表连接任意两个区域的边数,W代表虫洞的数量。John喜欢时光旅行,在他的农场里有许多区域,区域之间被一些正权的边和一些负权的虫洞连接。判断John能否在区域之间实现时光旅行。题解:即判断有无带负权的环存在。#include#define INF 100000000#define MAX 10000struct Edge {原创 2011-09-09 10:33:43 · 557 阅读 · 0 评论 -
POJ 3020 Antenna Placement 匈牙利算法
题意:一个矩形格子里,有n个城市,现在这n个城市都要覆盖无线。对于任意一个基站,它可以覆盖任意相邻的两个格子。那么如和建立基站,才能使所有的城市都被覆盖,并且所用的基站数量最少?题解:把城市看作点,相邻的两个城市之间连一条边。若a,b间存在一条边,那么a,b可以用同一个基站覆盖,而那些单独剩下的每一个点都必须用一个基站来覆盖。所以总的基站个数 = 最小边覆盖 = 最大二分匹配 + 最大独立原创 2011-09-06 17:09:07 · 722 阅读 · 0 评论 -
POJ 2226 Muddy Fields 匈牙利算法/最小点覆盖
题意:农夫John的养牛场,是一个R 行C 列的矩形,一场大雨后,养牛场低洼的地方都有了积水。John 的牛都很娇贵的,他们吃草的时候,不想把他们的蹄子给弄脏了。为了不让牛儿们把它们的蹄子弄脏,John 决定把有水的地方铺上木板。他的木板是宽度为1,长度没有限制的。他想用最少数目的木板把所有有水的低洼处给覆盖上,前提是木板不能覆盖草地,但是可以重叠。这道题,构图确实比比较巧妙,如果原创 2011-09-03 10:05:54 · 951 阅读 · 0 评论 -
POJ 1041 John's trip (欧拉回路)
题意:John买了新车,想开车去拜访他的朋友,已知每条街道上都恰巧有他的一个朋友,所以他想穿过每条街道一次并且回到起点。城镇上街道总数不超过1995,节点总数不超过44,任意一个节点所关联的街道总数不超过44,每一条街道所关联的两个节点都不同,每条街道的编号也不同。起点是第一次输入的两个节点中较小的那个。若存在多条回路,输出字典序最小的。#include using namespace st原创 2011-11-12 18:44:04 · 1016 阅读 · 0 评论 -
POJ 2404 Jogging Trails (中国邮递员问题,状态压缩DP)
题意:Gord在为一场马拉松做准备,他家后面有一个公园,公园里有许多路径,这些路径连接了水上景点(n题解:计算出任意两点之间的路径,统计出奇度顶点,找出这些奇度顶点的最小带权匹配(貌似计算一般图的最优带权匹配不太好弄,拆点然后用KM做是不对的)。有一个算法叫做Edmonds-Johnson算法可以解决中国邮递员问题,但是我找不到具体代码。#include using namespa原创 2011-11-11 16:28:49 · 3125 阅读 · 1 评论 -
最小生成树模版(Prime+邻接表)
最小生成树模版(Prime+邻接表) 使用优先队列+邻接表的prime算法#include #include using namespace std;typedef struct { long v; long next; long cost;}Edge;typedef struct { long v; lon转载 2011-11-05 08:42:08 · 2175 阅读 · 0 评论 -
POJ 2387 Til the Cows Come Home (Spfa)
题意:一头奶牛沿着路标回家,求最短路径。题解:注意处理重边。感觉不错,以后对于无向图就用vector构图,可以省去对重边的处理。对于有向图用记录头结点的边的方式构图。#include#include#includeusing namespace std;#define MAX 10000#define INF 9999999struct Edge { int v,原创 2011-10-08 23:30:35 · 636 阅读 · 0 评论 -
POJ 2516 Minimum Cost 最小费用最大流
题意:有N个客户,M个仓库,和K种货物。已知每个客户需要每种货物的数量,每个仓库存储每种货物的数量,每个仓库运输各种货物去各个客户的单位费用。判断所有的仓库能否满足所有客户的需求,如果可以,求出最少的运输总费用。题解:因为 K 种产品互相不干扰,所以关键是把 K 种产品分开求解。#include #include using namespace std;#define N原创 2011-10-10 22:57:16 · 810 阅读 · 0 评论 -
POJ 3352 Road Construction (边双连通,缩点)
题意:加上最少的边,使得改造后的图中去掉任意一条边后图依然连通。题解:先找出边双连通分量,然后缩点,的到一棵树。需要加的最少边=(leaves+1)/2PS:我们可以发现low[4]=3,low[7]=4 但是我们知道这条边并不是割边.所以 low[u]!=low[v]是割边的必要不充分条件. #include#include#includeusing na原创 2011-10-22 10:29:53 · 980 阅读 · 0 评论 -
最短路 并查集/利用边的性质求最短路
题意:N个城市,标号从0到N-1,M条道路,第K条道路(K从0开始)的长度为2^K,求编号为0的城市到其他城市的最短距离输入:第一行两个正整数N(2接下来M行两个整数,表示相连的两个城市的编号,输入数据中保证没有重边输出:N-1行,表示0号城市到其他城市的最短路,如果无法到达,输出-1,数值太大的以MOD 100000 的结果输出。思路:由于第i条边的权值w[i] = 2^i,原创 2012-04-22 15:49:41 · 5532 阅读 · 1 评论 -
POJ 2337 Catenyms (欧拉回路)
题意:给你n个单词,让每个单词的最后一个字母恰好等于下一个单词的第一个字母。构造这样一个串,使每个单词恰好被用到一次。取字典序最小的。例如,把 aloha arachnid dog gopher rat tiger 串成 aloha.arachnid.dog.gopher.rat.tiger。 若所个的单词不能构成这样一个串,那么输出“***”。题解:乍一看原创 2011-11-13 12:25:48 · 1751 阅读 · 0 评论 -
POJ 1236 Network of Schools (强连通分量,块,缩点)
题意:一些学校通过网络连接在一起,每个学校手中有一份名单,即它所指向的点。学校A的名单中有学校B,并不能保证学校B的名单里有学校A。现在有一软件,1.问至少发给几个学校才能保证所有的学校都可以得到该软件。2.至少加几条边才能使将软件发给某个学校后,其他所有学校都可以得到软件。题解:第一问求的是入度为0的点。第二问求的是加几条边使图变为强连通图。PS:有向无环图中所有入度不为0的点,一定原创 2011-10-18 15:29:56 · 609 阅读 · 0 评论 -
POJ 2186 Popular Cows (强连通分量)
题意:—给定一个有向图,求有多少个顶点是由任何顶点出发都可达的。题解:1. 求出所有强连通分量 2. 每个强连通分量缩成一点,则形成一个有向无环图DAG。—3. DAG上面如果有唯一的出度为0的点,则该点能被所有的点可达。那么该点所代表的连通分量上的所有的原图中的点,都能被原图中的所有点可达,则该连通分量的点数,就是答案。—4. DAG上面如果有不止一个出度为0的点,则这些点互相不可达,原问原创 2011-10-18 16:02:27 · 561 阅读 · 0 评论 -
POJ 1511 Invitation Cards (Spfa)
题意:一群学生去城市的各个车站发邀请函,每个车站恰有一个学生。任意两个车站之间都可达,并且有一个特定的车费。假如学生们早上都从车站1出发,晚上从各个车站回到车站1,求总的最小花费。题解:人生第一道Spfa。题意很明确,求带权最短路径。回来的时候反向建图即可。#include #include using namespace std;#define N 1000001#d原创 2011-10-08 22:44:21 · 529 阅读 · 0 评论 -
POJ 1201 Intervals (差分约束系统)
题意:给你许多小区间[ai,bi],并且指定每一个小区间内至少包含ci个数。然后求一个长度最小区间 z, 使得与每一个小区间的相同元素都>=ci。题解:1.假设区间z=[s,t], sum[i]表示[s,t] ∩ [s,i] 的元素个数。那么[ai,bi] >= ci 则可以表示为sum[bi]-sum[ai-1]>=ci。2.若i3.若i但是在本题中 0 //AC原创 2011-10-15 16:03:55 · 835 阅读 · 0 评论 -
POJ 1087 A Plug for UNIX (最大流,EK算法)
题意:读题很恶心···。大概就是说现在有n个不同的插孔,m台不同的用电器,k种适配器。(适配器就相当于一个中间插座,比如一个适配器是(x,y)。有一台用电器必须插x插孔,但是现在只有一个y插孔,那么就可以通过适配器来连接)。另外需要注意的就是给出的是适配器的种数,每一种的数量无限制。题解:建图的大概思路。s-->电器-->适配器-->插孔-->t#include #include原创 2011-10-11 18:07:10 · 633 阅读 · 0 评论 -
POJ 2516 Minimum Cost (最小费用最大流,KM解法)
题意:有N个客户,M个仓库,和K种货物。已知每个客户需要每种货物的数量,每个仓库存储每种货物的数量,每个仓库运输各种货物去各个客户的单位费用。判断所有的仓库能否满足所有客户的需求,如果可以,求出最少的运输总费用。题解:因为 K 种产品互相不干扰,所以关键是把 K 种产品分开求解。给出了两种slack方式。#include using namespace std;#defin原创 2011-10-10 23:00:09 · 705 阅读 · 0 评论 -
POJ 2195 Going Home (二分图最大权匹配、KM算法)
题意:给你一张图,图上有n个人和n座房子,每个人需要回到一所房子,要求路程之和最小。...H.......H.......H....mmmHmmmm...H.......H.......H....题解:其实题目是求最小带权匹配,怎么化成求最大带权匹配呢?方法一可以将每个值取相反数。方法二用上界减去各个值。基本原理 该算法是通过给每个顶点一个标号(叫做顶原创 2011-10-05 20:39:45 · 1434 阅读 · 0 评论 -
POJ 1679 The Unique MST (次小生成树Prime/Kruskal)
题意:判断图中的最小生成树是否唯一。题解:只需验是否存在两个或两个以上权值相同的最小生成树。注意:1.图中任意两点间最多只有一条无向边; 2.图可能不连通(此时mst = 0)。Prime :复杂度 O( V ^ 2 )#include using namespace std;#define MAX 101#define INF 999999999#define原创 2011-11-05 10:43:15 · 968 阅读 · 0 评论 -
POJ 2728 Desert King (最小比率生成树,二分/迭代)
题意:沙漠里的王国需要修建水渠,连接国都与村庄····。说白了求一棵树,每个点有三个坐标(x,y,z)。边的benifit为两点之间的距离,cost为两点的高度差。现在要求一棵树使得 cost / benift 最小。题解:很显然任意两点之间都有边,所以是一个很稠密的图。用Prime。二分的话2800ms+, 迭代300ms+。#include #include using nam原创 2011-11-04 21:00:42 · 1118 阅读 · 0 评论 -
POJ 2987 Firing (最大权闭合子图Dinic)
题意:公司打算裁员,裁掉某些员工可以获得正收益,而裁掉某些员工会遭受损失。并且员工之间往往存在一定的关系,当某个员工被裁掉之后,在他的关系之下的所有员工都必须被裁掉。现在要求如何裁员才能获得最大收益。题解:s->正权, 负权->t。 ans = 正权和 - maxflow, 或者 ans = 正权和 - 没有被裁的正权和 - abs(被裁的负权和) ( 正边权进入最小割表示该人没被炒,非正边原创 2011-11-03 23:37:02 · 971 阅读 · 0 评论 -
POJ 1274 The Perfect Stall (匈牙利算法)
题意:一同牛只愿意在几个特定的棚子里面产奶。每头牛喜好不同,每个棚子只容纳一同牛。求最大匹配。#include using namespace std;#define N 210bool vis[N], bond[N][N];int match[N];int n,原创 2011-09-29 17:11:20 · 577 阅读 · 0 评论 -
POJ 1466 Girls and Boys (最大独立集Hungary)
题意:有n个学生,一男一女可能会陷入浪漫之中,现在知道每个人的浪漫关系。求一个最大集,使得集合里的所有人之间没有浪漫关系。题解:二分图匹配,最大独立集。#include using namespace std;#define N 510bool vis[N];i原创 2011-09-29 19:54:13 · 575 阅读 · 0 评论 -
HDU 2066 一个人的旅行 Dijkstra
题意:虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽原创 2011-09-09 11:21:14 · 1128 阅读 · 0 评论 -
POJ 2253 Frogger Floyd
题意:湖中以许多石头,其中一块石头上有一只青蛙Freddy, 他想通过在石头上跳跃去拜访另一只青蛙Fiona。求Freddy至少要能跳多远才能到达Fiona所在的石头。(Freddy在石头1上,Fiona在石头2上)题解:#include #include #in原创 2011-09-09 10:13:23 · 615 阅读 · 0 评论 -
POJ 3026 Borg Maze BFS+Prim
题意:给定一个迷宫,在一个迷宫内,建立一颗最小生成树连接所有点。(这些点即‘A’或‘S’)题解:通过BFS找到'S'与每个’A'之间的最短路径。然后prim 建立最小生成树。#include #include #include using namespace st原创 2011-09-08 23:45:09 · 672 阅读 · 0 评论 -
POJ 1502 MPI Maelstrom Dijkstra
题意:求信息从第一个点发送至其他所有点所需的最小时间。以下三角的形式输入,若不能从 i 传至 j, 则用x表示。题解:需要注意输入。#include #include using namespace std;#define INF 200000000int ma原创 2011-09-09 10:56:06 · 1200 阅读 · 0 评论 -
POJ 2485 Highways Kruskal
题意:将n个小镇连接起来,求最小生成树。题解:#include using namespace std;int t,n,father[501];struct path{ int u,v,w;} edge[501 * 500 / 2];int cmp(c原创 2011-09-09 01:01:44 · 505 阅读 · 0 评论 -
POJ 1860 Currency Exchange Bellman-Ford
题意:能否通过套汇盈利。题解:#include using namespace std;double dist[210], v;int n, m, s;struct item{ int a, b; double r,c;} node[210];bo原创 2011-09-09 10:39:03 · 494 阅读 · 0 评论 -
POJ 1125 Stockbroker Grapevine Floyd
题意:出于竞争目的,股票经纪人要在他们的人际关系网中传播一些谣言。但是每个股票经纪人只能传他给他所熟悉的几个人。当谣言从第一个人传出后,最快经过多多长时间最后一个人可以收到谣言。题解:通过Floyd求出任意两个人之间的cost。然后分析一下即可。#include u原创 2011-09-09 01:23:24 · 628 阅读 · 0 评论 -
POJ 2240 Arbitrage Floyd
题意:套汇问题。问能否套汇盈利。题解:#include #include using namespace std;char cur[31][50];char str1[50], str2[50];double arb[31][31];int n,m;b原创 2011-09-09 01:08:16 · 577 阅读 · 0 评论 -
POJ 2724 Purifying Machine (二分图最大独立集Hungary)
题意:迈克有一台可以净化奶酪的机器,用二进制表示净化的奶酪的编号。但是,在某些二进制串中可能包含有‘*'。例如01*100,'*'其实就代表可以取0,1两种情况--> 010100 和011100。现在由于迈克不小心,他以同样的方式弄脏了某些奶酪,问你最少用多少次操作就可以把弄脏原创 2011-09-29 22:50:36 · 1663 阅读 · 0 评论 -
POJ 3195 Candies (差分约束)
题意:幼稚园分糖果,输入a,b,c表示,小孩a最多只能忍受小孩b的糖果比他多c个。求第一个小孩和最后一个小孩最多可以相差多少个糖果。题解:卡队列呀···。手写了一个循环队列果断超时。改成栈则AC。貌似还有许多优化的方法,比如用优先级队列或者堆。#include usi原创 2011-10-13 00:58:30 · 909 阅读 · 0 评论 -
POJ 2289 Jamie's Contact Groups (二分+匹配/网络流)
题意:把n个点,分到m个组中。题目给出每一个点可以被分到的那些组。要求分配完毕后,最大的那一个组的人数最小。题解:比较怪。一开始化作费用流做。假设每一次增广过后,路径上所有边的费用增大相等的值,这样一来,被增广过的路径下一次就不会被立即增广了。这样就能使与汇点相连的那些点均匀增加。结果悲剧TLE```。#include using namespace std;#define MAX原创 2011-10-27 23:47:26 · 1429 阅读 · 0 评论 -
POJ 2135 Farm Tour (最小费用最大流)
题意:FJ带他的朋友参观农场,他们的起点是1,终点是N, 点与点之间可能存在路径。现在要求从1到N,在从N回到1所走的最短路程。并且返回时已经被走过的路不能再走!题解:最小费用流。每条路只走一次,说明每一条边的容量为1。由于是无向图,所以从N走回1的过程其实就等同于再从1到N走一遍。那么就需要寻找两条从1到N的最短路径。取一个超级源点,将其与1连接,边的容量为2(两条路),费用为0。N与一超级原创 2011-10-25 21:41:56 · 712 阅读 · 0 评论