ACM 图论
yerongsc
这个作者很懒,什么都没留下…
展开
-
poj 3680 Intervals
对于每个区间的端点进行保存,用set容器来保存点,任意相邻的点之间连(k,0)的线,对于输入的点连接(1,-w)的线,即离散化整个输入区间。#include #include #include #include #include using namespace std;struct node{ int u,v,cost,flow,next;};struct Li原创 2013-08-14 15:26:08 · 347 阅读 · 0 评论 -
poj 3469 Dual Core CPU
以2块CPU分别为源点和汇点,从源点到每一个节点的容量为Ai,从节点到汇点的容量为Bi,若两个节点存在关系,则在2个节点间建立2条有向边,容量为额外花费在这个图的模型下求出最小割,则为最小花费。#include #include #include using namespace std;const int INF=1000000000;const int原创 2013-05-09 11:51:16 · 513 阅读 · 0 评论 -
poj 2195 Going Home
最小费用最大流,直接贴模板过,注意数组开小了会RE/*最小费用最大流*/#include #include #include #include #include using namespace std;struct node{ int u,v,cost,flow,next;};struct Pos{ int原创 2013-05-08 13:31:27 · 744 阅读 · 0 评论 -
poj 1149 PIG
建图才是王道,建完图就是裸最大流问题了建图参考:http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html/*最大流问题*/#include #include #include #include using namespace std;int c[105][105];int a[10原创 2013-05-07 19:00:57 · 363 阅读 · 0 评论 -
hdu 2833 WuKong
求2条最短路径的公共路径上的节点数公共路径必为最短路径,故枚举任意2点的最短路径,判断这2点是否属于2条最短路,若属于,获取2点之间的节点数,求出一个最大的节点数即可Floyd求出任意2点最短路径,并保存任意2点之间的节点数#include #include using namespace std;int map[305][305];int path[3原创 2013-05-06 16:50:36 · 415 阅读 · 0 评论 -
hdu 2807 The Shortest Path
矩阵乘法加Floyd注意A,B,C不同即可#include #include using namespace std;int n,m;struct Matrix{ int mat[100][100];}city[100];int map[100][100];const int inf = 100000;Matrix zero;原创 2013-05-06 15:46:07 · 395 阅读 · 0 评论 -
sgu 326 Perspective
题意:一个赛区有N个球队,1号球队是自己的,每个球队有已经获得的分数,剩余的比赛场数,赛区内球队之间的比赛场数都为已知。为了获得第一,假设1号球队剩余的比赛场数都胜利,更新score[1],赛区内其他队伍跨赛区的比赛都失败。接下来建图,从S到每一个球队连接一条容量为score[1] - score[i]的值,若球队i跟j存在比赛k场,连接i,p,容量为k,连接j,p容量为k,连接p,t容量原创 2013-05-19 20:20:14 · 435 阅读 · 0 评论 -
poj 1966 Cable TV Network
求删除最少的点使得图不联通将每一个点拆分为i,i',连接i,i'为1,若原图中存在g[u][v] = 1,连接u'到v,容量为INF,连接u,u'为1,连接v,v'为1枚举源点和汇点,求出最小的最大流即为可以删除的最少点#include #include #include using namespace std;const int INF原创 2013-05-19 20:39:56 · 405 阅读 · 0 评论 -
poj 1273 Drainage Ditches
最大流入门题目注意重边的处理/*最大流问题*/#include #include #include #include using namespace std;int n,m;int c[205][205];int flow[205][205];int a[205];int pre[205];const int inf = 0x7f原创 2013-05-06 21:29:49 · 319 阅读 · 0 评论 -
poj 2125 Destroying The Graph
每次删除一个点的所以出边或者入边,求最少的费用拆点+最大流最后从源点DFS即可容量为0的边不一定为割边,一定要有DFS搜,不能直接BFS容量为0的边#include #include #include using namespace std;const int INF=10000000;const int N=10原创 2013-05-20 14:11:04 · 441 阅读 · 0 评论 -
poj 3204 Ikki's Story I - Road Reconstruction
先求一次最大流,再从源点和汇点进行DFS,得到2个点集,遍历所有正向边,(判边的时候一定i+=2,否则会wa),若该边的容量为0,起点在点集1,终点在点集2,则该边为可扩建的。从汇点DFS需注意判断edges[i^1].cap>0,即正向满流的情况下,不在继续向后DFS注意该组测试数据/*4 60 1 40 2 21 2 21 3 12 3 72 0原创 2013-05-19 18:01:05 · 376 阅读 · 0 评论 -
hust 1024 dance party
n对男女,每一个人最多可以忍受和k个不喜欢的人跳舞,每一轮不能出现上一轮出现过的一队,问一共可以安排多少轮二分+最大流+拆点每个人拆分为p,p',p与p'连接容量为k的边,S与每个男生p连接容量为ans,t与每个女生p连接容量为ans的边,若男生p喜欢女生p,则2点连线容量为1的边,若男生p不喜欢女生p,则2个p'连线容量为1的边,若最大流=n*ans ,则可以继续增大an原创 2013-05-24 20:50:31 · 757 阅读 · 0 评论 -
hdu 2732 Leapin' Lizards
对柱子进行拆点,可以直接到安全地方的柱子与汇点相连,上面有蜥蜴的柱子与源点相连,容量为1,点和拆点之间边的容量为点权,可以到达的点之间连线,容量为INF,第一个点可以到三个点,则1'->3连接INF注意答案为1是时 语句使用单数和was 。。。。。#include #include #include using namespace std;const原创 2013-05-26 16:06:00 · 373 阅读 · 0 评论 -
poj 3259 Wormholes
题意:一个人从在农场的任意一块地方开始走,但是有一些地方有虫洞,经过虫洞后,他会回到t秒前,求一个人能否从一个点开始走,最后回到该点的时间小于他出发的时间,即他经过一个虫洞后穿越到自己走之前去了用spfa判断是否存在负环,加一个入队统计数组,若一个点入队次数超过n次,则存在负环。#include #include #include #include using na原创 2013-06-25 20:35:57 · 449 阅读 · 0 评论 -
poj 1679 The Unique MST
判断最小生成树是否唯一先求一次最小生成树,再依次删除最小生成树中的边,求n-1次最小生成树,判断是否与最小生成树相同。#include #include #include using namespace std;int map[150][150];int dis[150];bool visit[150];int pre[150];bool use原创 2013-07-10 22:36:01 · 372 阅读 · 0 评论 -
poj 1486 Sorting Slides
判断一些点属于哪些矩阵,每个矩阵是透明的,要求输出所有能够确定的顺序。二分图并判断每一个点是否是唯一匹配,先做一次最大匹配,在对一个点删除其匹配边,重新对该点进DFS,若能找到新的匹配,则该点不是唯一匹配反之,是唯一匹配,输出。#include #include #include using namespace std;const int MAXN =原创 2013-06-13 10:39:25 · 466 阅读 · 0 评论 -
poj 2594
与直接的最小覆盖不相同的是,本题最小路径上的点可以重复访问,即需要用Floyd重新构图,然后再求最小覆盖。#include #include #include using namespace std;const int MAXN = 1005;bool map[MAXN][MAXN];bool visy[MAXN];int match[MAXN];原创 2013-05-29 22:25:36 · 543 阅读 · 0 评论 -
poj 2112 Optimal Milking
二分答案+最大流先求出牛各个点之间的最短路径,二分答案限制边,判断最大流是否等于奶牛头数#include #include #include #include using namespace std;int g[500][500];int maxcost,maxcnt;const int INF=10000000;const int N=10原创 2013-05-15 10:42:39 · 419 阅读 · 0 评论 -
poj 1815 Friendship
求最小割集,并按字典顺序打印将每个节点拆分,的权值为1,若存在有向边,则权值为INF,添加源点S,汇点T,S连接s',T连接t,权值为INF枚举每一个点,将权值置为0.,若最大流减小1,则该点为最大流上的点。#include #include #include using namespace std;const int INF=10000000;原创 2013-05-14 21:05:56 · 411 阅读 · 0 评论 -
poj 1637 Sightseeing tour
题意:给出一个混合图(有的边有向,有的边无向),问此图是否存在欧拉回路。先说说欧拉回路吧,起点和终点相同,经过图G的每条边一次,且只经过一次的路径称为欧拉回路。按照图的不同分为:无向图欧拉回路、有向图欧拉回路和混合图欧拉回路。判断一个图是否存在欧拉回路:1.无向图:图连通,且图中均为偶度顶点。2.有向图:图连通,且图中所有顶点出入度相等。3.混合图:混合图欧拉回路的转载 2013-05-14 19:01:17 · 461 阅读 · 0 评论 -
poj 1325 Machine Schedule
最小点权覆盖 = 最大匹配#include #include #include using namespace std;const int MAXN = 1005;bool map[MAXN][MAXN];bool visy[MAXN];int match[MAXN];int n1,n2;//x集合的个数,y集合的个数bool DFS原创 2013-05-27 11:10:17 · 395 阅读 · 0 评论 -
hdu 2833 kebab
题意:每个顾客有到达时间和离开时间,需要的数量,和每一个烤肉需要的时间,厨师每个单位时间都能烤m块,每一个烤时间t的肉可拆分为t块,烤一分钟。将源点和每个顾客相连,容量为n*ti,记录每一个到达时间和离开时间,删除重复的时间点,将时间排序,相邻2个时间点为一个时间段,每一个时间段作为一个节点和汇点相连,容量为时间段的长度*m,若一个时间段在顾客的到达和离开时间段内,则该顾客节点和时间段原创 2013-05-26 18:51:30 · 486 阅读 · 0 评论 -
hdu 1569 方格取数(2)
最大独立点集 + 最小点覆盖集 = 总权黑白涂色法建图 相邻的2块分别涂成黑色和白色,相邻的黑色到白色连接1条INF的边,源点到所以黑色连边,容量为格子的权值,所有白色到汇点连边,容量为权值,求最大流,总的权值减去该最大流即为答案。这样删掉割边后,剩余的一定不相邻#include #include #include using namespace原创 2013-05-26 09:42:21 · 509 阅读 · 0 评论 -
zoj 2587 Unique Attack
判断最下割集是否唯一求一次最大流源点汇点分别进行DFS,得到2个点集交集为空,并集为所有点集,则唯一#include #include #include using namespace std;const int INF=1000000000;const int N=100005;struct Node{int v原创 2013-05-20 16:09:46 · 407 阅读 · 0 评论 -
poj 3281 Dining
构图的时候需要将牛进行拆点,表示一头牛只能吃一种食物,点权转为边权是往往采用拆点的技巧。源点与食物相连,食物与牛相连,牛的拆点与饮料相连,饮料与汇点相连,容量全部为1,求最大流即可。#include #include #include using namespace std;const int INF=1000000000;const int N=100005;原创 2013-05-19 15:42:00 · 424 阅读 · 0 评论 -
POJ 2240 Arbitrage
Floyed 求两点间乘积最大若存在环的值大于1,则有利润#include #include #include using namespace std;const double INF = 0;double dis[50][50];char c[50][1000];char a[1000];char b[1000];void Floyed原创 2013-04-28 14:26:00 · 388 阅读 · 0 评论 -
POJ 3662 Telephone Lines
求从1到n的路径在免费K条路径下剩余的路径中最小的最大值。二分搜索+SPFA每次枚举边len,假设最大的边为len,将小于len的边的长度设为0,大于len的边的长度设为1,求1到n的最短路径,若最短路径#include #include #include #include #include using namespace std;const int I原创 2013-04-28 12:27:36 · 384 阅读 · 0 评论 -
POJ 3037 Skiing
题目大意:设A为起点,若A点的高度为h1,B点的高度为h2,A点的速度为va,则A到B的时间等于1/va,到达B点后速度为va*2^(h1-h2).因此从B点出发,到达下一个点的时间是1/va*2^(h1-h2),下一个点的速度为va*2^(h1-h2)*2^(h2-h3) = va*2^(h1-h3).因此每个点到下个点的时间是相对于起点固定的。SPFA求解#includ原创 2013-04-18 22:13:44 · 632 阅读 · 0 评论 -
POJ 1724
直接DFS+减枝#include #include #include using namespace std;struct Edge{ int to; int w; int money; int next;}edge[10005];int k,n,r,num;int head[105];bool vis原创 2013-04-25 21:38:08 · 417 阅读 · 0 评论 -
POJ 3159 SPFA最短路径
题意就是求1到n的最短路径这个题的数据用SPFA算法,但是由于题目数据的原因,必须将队列换成栈来实现SPFA算法每次从队首取出一个元素,检查与队首邻接的元素的dist数组是否可以更新,若可行更新,且该元素不在队列中,进行入队操作,重复上述步骤,直到对列为空。#include #include #include #include #include using name原创 2013-04-17 22:45:53 · 460 阅读 · 0 评论 -
POJ 2449 第k长的最短路径
迪杰斯特拉+A*算法f(i) = g(i) + h(i)优先队列每次让队列中f最小的值出队若t第n次从队列出来,则为从s到t的第K条最短路径#include #include #include using namespace std;struct Edge{ int to; int w; int next;};原创 2013-04-24 23:26:43 · 493 阅读 · 0 评论 -
POJ 2349 克鲁斯卡尔和Prime算法
给N个点的坐标,若2点之间距离小于D,则2点联通。生成最小生成树,减去卫星的数量条最大边, 剩余的最大边的长度即为所求的最小D克鲁斯卡尔算法求最小生成树#include #include #include #include using namespace std;const int MAX = 505;int Count;int father原创 2013-04-16 21:58:14 · 587 阅读 · 0 评论 -
POJ 1797和2253 最大生成树的最小边 和 最小生成树的最大边
求最大生成树的最小边注意事项:求出1到n的路径即可,不需要求出整个生成树,否则会将生成树的其他边参与运算,出现错误1797#include #include using namespace std;int map[1005][1005];int dis[1005];bool visit[1005];int ans;void Pri原创 2013-04-23 22:11:55 · 442 阅读 · 0 评论 -
LightOJ 1002 最小生成树
利用prime算法构造最小生成树#include #include #include using namespace std;const int MAX = 505;int MIN = 0x7f;int path[MAX][MAX];int dis[MAX];bool visit[MAX];void prime(int home,int n)原创 2013-04-15 23:28:13 · 565 阅读 · 0 评论 -
POJ 1502 迪杰斯特拉求0节点到其他节点最短路径的最大值
题意求0节点到其他节点最短路径的最大值#include #include #include #include using namespace std;int map[105][105];int dis[105];int visit[105];void dijkstra(int n){ int record = 0; int原创 2013-04-22 22:50:42 · 419 阅读 · 0 评论 -
hdu 1385 Minimum Transport Cost
使用Floyd算法变形,将tax附加到松弛条件中使用二维数组保存路径,每次存储路径的下一个目标值。#include #include #include using namespace std;int map[1005][1005];int b[1005];int n;const int INF = 0x7fffffff;int path[1005][原创 2013-04-30 19:44:49 · 479 阅读 · 0 评论 -
POJ 1511 Invitation Cards
求1到各个点的最短路径和各个点到1的最短路径之和构造2次路径方向相反的图,调用2次迪杰斯特拉算法即可第一次的图路径按输入构建,第二次的图构造将图的所有节点之间的路径反向,在求1到各个点的最短路径等效于从各个点到1的最短路径#include #include #include using namespace std;int p,q;int ans;stru原创 2013-04-30 21:38:44 · 310 阅读 · 0 评论 -
hdu 2647 Reward
反向建图,拓扑排序,则可以按钱递增的方式求出每一个员工的需求#include #include #include using namespace std;bool visit[10005];int head[10005];int du[10005];int money[10005];struct Edge{ int to;原创 2013-05-05 22:00:43 · 369 阅读 · 0 评论 -
poj 1698 Alice's Chance
题意:所以电影同时开始,每一部电影需要Alice到场的总天数和拍摄时间为已知,每一部电影Alice可以选择每一周的其中几天去拍摄,求Alice是否能将所以电影都拍摄完毕。我一开始的建图:将周一到周日与源点相连,容量为最大的截止周,每一部电影允许的拍摄日与每一部电影相连,容量为该电影的截止周,每一部电影与汇点相连,容量为拍摄总时间,若最大流等于所以拍摄时间之和,则输出Yes.这样的建图有原创 2013-05-19 14:26:32 · 550 阅读 · 0 评论 -
poj 3436 ACM Computer Factory
题意:每一台电脑由P个模块组成,生产线上有N个机器可以生产电脑,每一台机器由 产量,电脑到该机器时需要已完成的模块,电脑经该机器后完成的模块构成。将每一个机器看成一个点,即对每一个点的流量有限制,进行拆点,源点与输入全0的机器相连,汇点与输出全1 的机器相连,容量为INF,每一个点与拆后的点相连,容量为流量,一个机器完成后的模块与另一台机器需要的模块相匹配,则该点的拆点与另一点相连,容量为IN原创 2013-05-19 12:59:41 · 374 阅读 · 0 评论