图论
文章平均质量分 73
accepoc
这个作者很懒,什么都没留下…
展开
-
CodeForces 472D Design Tutorial: Inverse the Problem (最小生成树)
题意:给出一个树中每两个节点的距离,问是否能构成一颗加权树。思路:以下几种情况可以直接输出NO:arr[i][i]!=0, arr[i][j] == 0(i != j), arr[i][j]!=arr[j][i].否则,每次选最小的边,加入生成树,最后在算一遍节点两两之间的距离,如果与输入矩阵不同则输出NO。节点两两距离dist[i][j] = dist[root][i] + di原创 2015-01-06 21:44:02 · 925 阅读 · 0 评论 -
poj1639 Picnic Planning 限制顶点度数的MST
题意:有n个兄弟去野餐,目的地为Park。每个人可以选择直接去Park,也可以选择去其他人家,和他一起坐车去Park。每个人家的停车位没有限制,但是Park的停车数不能超过k。问所有人的最短路程。思路:假设Park的停车数没有限制,那么这题就是一道最小生成树了。但是本题限制Park的停车数不能超过k,把Park看做根节点记为V0,那么就是说它的度数不能超过k。得到一原创 2015-01-20 16:43:49 · 2493 阅读 · 0 评论 -
poj2186 Popular Cows (Tarjan)
题意:找出一副图中,其他点都可以到达的点的个数。思路:原创 2015-01-21 16:31:03 · 473 阅读 · 0 评论 -
poj2723 Get Luffy Out (二分+2-SAT)
题意:有m扇门,每扇门都有两把锁,只要打开其中一把就可以打开这扇门,打开了第i扇门才能继续开第i+1扇门。现在有2n个钥匙,每两个绑在一起,使用了一个就不能使用另一个。问最多能开几扇门。思路:绑在一起的两个钥匙A和B,用了A就不能用B,用了B就不能用A,建边A->B',B->A'。一扇门上的两个锁C和D,不开C就必须开D,不开D就必须开C,建边C'->D,D'->C原创 2015-01-21 17:08:06 · 753 阅读 · 0 评论 -
poj3905 Perfect Election (2-SAT)
题意:有n个人参加竞选,共有m条民意调查结果:民意调查结果:编码方式如果i与j至少有一人当选,我会很高兴。+i +j如果i与j至少有一人不当选,我会很高兴。-i -j如果i当选或者j落选,我会很高兴。+i -j如果i落选或者j当选,我会很高兴。-i +j问是否可以满足所有m条民意调查结果,输原创 2015-01-22 09:58:51 · 644 阅读 · 0 评论 -
poj2553 The Bottom of a Graph (Tarjan)
题意:如果一个点v可以到达w,且w也一定可以到达v,则称v是一个sink。要求按顺序输出所有的sink。思路:sink可以到达的点都可以到达sink,也就是说sink可以到达的所有点都与sink在一个强连通分量里。可见,sink所在的强连通分量是没有出度的。所以只要输出没有出度的强连通分量中的所有点就可以了。代码(1312K,79MS):#include #i原创 2015-01-21 16:09:17 · 529 阅读 · 0 评论 -
poj2762 (Tarjan + dp找最长链)
题意:给定一副有向图,选择两个点v和u,要求v能到达u或者u能到达v。问是否可以对于图中的每一个点对都能满足条件?输出Yes或No。思路:强连通分量中的点可以看作一个点,所以先tarjan缩点。然后当且仅当缩点图是一条链时才能满足任意一个点对都能从一点到达另一点。因为如果缩点图有分叉,则分叉之间一定是不可达的。所以只要dp求最长链,如果长度就是缩点后点的个数则输原创 2015-01-21 16:45:24 · 1132 阅读 · 0 评论 -
poj1949 Chores SPFA
题意:现有n个任务,每个任务必须在一些任务完成后才能执行。问完成所有任务的最短时间。思路:建图:对于每个任务i,它的每个前趋向i连边,权值为执行任务i的时间。如果某个任务没有前趋,则源点向它连边,权值为执行任务i的时间。做法:设任务i完成的最短时间为dist[i]。对于i的一个后继j:dist[j] = max(dist[j], dist[i] + e[原创 2015-01-20 11:53:47 · 372 阅读 · 0 评论 -
poj3207 2-SAT
题意:一个圆上顺时针放着n个点,现在要连m条边,每条边可以从圆的内部连也可以从圆的外部连。保证每个点最多连1条边,问是否能使所有的边都不相交。思路:典型的2-sat问题。建图:对于一条边i,在圆内记为i,在圆外记为i'。设边i连接点A,B,边j连接点C,D。i与j在圆内是否相交就是线段AB与线段CD是否相交,用坐标判断一下。可以证明,如果i与j在圆内不能共存,则原创 2015-01-22 08:52:15 · 1297 阅读 · 0 评论 -
poj1486 Sorting Slides 二分图匹配的必须边
题意:n个矩形从A到A+n标号,n个数字从1到n标号。给出矩形和数字的坐标,如果数字在矩形内则可以匹配。问哪些匹配是唯一确定的。思路:先得到一个完美匹配,然后枚举每一条边将其删去。如果剩下的边仍能构成完美匹配,则这条边不是必要的,否则这条边是必要的。按照矩形字母的顺序输出所有必要的匹配。代码(720K,0MS):#include #incl原创 2015-01-26 11:51:29 · 657 阅读 · 0 评论 -
poj3041 Asteroids 最小点覆盖 二分图匹配
题意:一个矩阵,其中一些点上有小行星。一次可以摧毁1行或者1列的全部小行星,问最少几次可以摧毁所有小行星。思路:如果在(i, j)这个点上有小行星,则连边i->j。i与j只要选一个,这条边代表的小行星就会被摧毁。可见,本题答案就是最小点覆盖,即选择最少的点,使每条边都至少有一个端点被选中。二分图中最小点覆盖=最大匹配代码(736K,16MS):#原创 2015-01-26 12:00:25 · 537 阅读 · 0 评论 -
bzoj1698 [Usaco2007 Feb]Lilypad Pond 荷叶池塘 [BFS]
Description为了便于牛们欣赏和锻炼,农夫JOHN在他的农场上新添加了一个美丽的池塘。 JOHN的池塘是一个长方形,他已经把它划分成了M行N列的小正方行 (1 <= M <= 30; 1 <= N <= 30). 某些正方行里是石头,另外一些则是特别结实的荷叶,其余则只有清水。 为了锻炼,Bessie想从一片荷叶跳到另外一片。她的每一次跳跃都是一个象棋中的马步:两行一列或一行两列。 JOHN原创 2015-04-02 12:59:44 · 899 阅读 · 0 评论 -
poj2987 最大权闭合图
题意:公司要进行裁员,裁掉一个人可以获得一定的利益或损失(用正数和负数表示)。一些人之间有附属关系,比如b是a的下属,则裁掉a就必须裁掉b。问要取得最大的利益,最少要裁掉几个人,取得的最大利益是多少。思路:先说明什么是最大权闭合图:在一个图中,我们选取一些点构成集合,记为V,且集合中的出边(即集合中的点的向外连出的弧),所指向的终点(弧头)也在V中,则我们称V为闭合原创 2015-01-22 17:59:03 · 1266 阅读 · 0 评论 -
NOI2006 最大获利 (最大权闭合图)
题目连接:bzoj1497: http://www.lydsy.com/JudgeOnline/problem.php?id=1497题意:有m个用户群,n个中转站。满足第i个用户群必须要建造Ai,Bi两个中转站,可以使公司获利Ci。建立第i个中转站的费用是Pi。问最大获利是多少。思路:把用户群和中转站看成n+m个点,每个点有一个权值,用权值的正负表示获利还原创 2015-01-23 11:24:32 · 2252 阅读 · 0 评论 -
bzoj1663 [Usaco2006 Open]赶集 (最短路)
Description 每一年,约翰都会带着他的奶牛们去赶集.集会中一共有N(1≤N≤400)个商店,第i个商店会在特定的时间Pi(0≤Pi≤1090≤P_i≤10^9)对当时在店里的顾客送出一份精美的礼物.约翰当然得到了这个消息,于是他希望能拿到尽量多的礼物送给他的奶牛们.也就是说,他想尽可能多地在某商店发放礼物的时候,正好呆在店里. 经过一定的调查,约翰弄清楚了从i号商店走到J原创 2015-04-06 21:38:32 · 932 阅读 · 0 评论 -
bzoj3890 [Usaco2015 Jan]Meeting Time [spfa + A*]
Description Bessie and her sister Elsie want to travel from the barn to their favorite field, such that they leave at exactly the same time from the barn, and also arrive at exactly the same time at原创 2015-04-21 15:34:09 · 530 阅读 · 0 评论 -
bzoj 2433 [Noi2011]智能车比赛 [计算几何+spfa]
Description 新一届智能车大赛在JL大学开始啦!比赛赛道可以看作是由n个矩形区域拼接而成(如下图所示),每个矩形的边都平行于坐标轴,第i个矩形区域的左下角和右上角坐标分别为(xi,1,yi,1)和(xi,2,yi,2)。题目保证:xi,1<xi,2=xi+1,1,且yi,1< yi,2,相邻两个矩形一定有重叠在一起的边(如图中虚线所示),智能车可以通过这部分穿梭于矩形区域之间。选手们需要原创 2015-06-02 15:51:26 · 1016 阅读 · 0 评论 -
poj2060 Taxi Cab Scheme 最小路径覆盖
题意:有n个顾客做出租车,给出每个人的出发时间,出发地与目的地的坐标,问最少要多少辆出租车能满足需要。两地的距离为两地的曼哈顿距离,出租车一分钟可以行驶距离1。读入数据按照出发时间升序给出。思路:对于两个顾客i和他前面的某个顾客j,如果i到达目的地的时间,加上从i的目的地到j的出发地的时间小于j的出发时间,i和j就能用一辆车满足。所以,对于每个顾客i,枚举他前面的每原创 2015-01-20 16:28:03 · 515 阅读 · 0 评论 -
poj1904 King's Quest 强连通分量
题意:有n个王子和n个女孩,每个王子可能喜欢多个女孩。先给出一个初始的完备匹配,问每个王子可以选择哪些女孩(即无论王子选择这些女孩中的哪一个),使得剩下的王子仍能够选择喜欢的女孩。思路:每个王子向自己喜欢的每个女孩连边,对于每一对原配,女孩向王子连边。然后tarjan求强连通分量,与每个王子在同一强连通分量里的女孩就是答案。解释:首先可以看出任何一对原配都可原创 2015-01-20 11:23:14 · 780 阅读 · 0 评论 -
poj2516 Minimum Cost 拆点+KM算法
题意:有n个销售商,m个供应商,k种物品。给出原创 2015-01-27 12:07:47 · 912 阅读 · 0 评论 -
poj1470 Closest Common Ancestors LCA(最近公共祖先)
题意:给出一棵树和多组询问,然后依次输出以点i为最近公共祖先的询问有多少组。思路:很裸得LCA离线算法。代码(4664K,1547MS):#include #include #include #include #include using namespace std;int n, q;vector edges[1000];int ans[10原创 2015-01-27 17:08:44 · 493 阅读 · 0 评论 -
poj3686 The Windy's KM算法
题意:有n个订单,m个机器。每个机器同时只能处理一个订单,问最小的平均时间是多少。平均时间=总时间/订单数。总时间是等待的时间加上处理的时间。思路:对于一个机器,假如有k个订单要处理,则总时间为t1 + (t1 + t2) + (t1 + t2 + t2) + ... + (t1 + t2 + t3 + ... + tk)。所以,对于一个订单,假设它倒数第i个被处理原创 2015-01-27 12:22:21 · 568 阅读 · 0 评论 -
poj1062 昂贵的聘礼 (spfa)
思路:因为交易过的所有人等级之差最大不能超过m,所以枚举每一个宽为m的范围,其中必须包涵1号节点,遇到范围之外的点不考虑,分别求最短路即可。代码:#include #include #include #include #include #include using namespace std;struct Edge{ int to, v; Edge(int a, in原创 2015-01-09 18:06:13 · 868 阅读 · 0 评论 -
poj1125 (floyd)
题意:有n个股票经纪人,每个人可以向几个人传递消息,分别需要一定时间。问以哪一个经纪人作为源点可以使最长耗时最小。思路:先一遍floyd求出每人到其他人传递消息所用的时间,然后枚举源点,使最大值最小即可。代码:#include #include #include #include using namespace std;int n;int edges[105][原创 2015-01-09 19:26:30 · 743 阅读 · 0 评论 -
poj2195 Going Home 最小权值匹配
题意:有n个人和n个房子,给出他们的坐标。要把任何房子一一匹配,问所有人回家的总路程的最小值。人与房子的距离为曼哈顿距离。思路:每个人向每个房子连边,权值为距离,然后KM算法求最小权值匹配。代码(736K,#include #include #include #include #include #define INF 0x3f3f3f3fus原创 2015-01-26 15:10:09 · 657 阅读 · 0 评论 -
poj1466 Girls and Boys (最大独立集 二分图匹配)
题意:有n个人要配对,每个人都有几个喜欢的对象。问最多能选出几个人,使得选出的人无法配对。思路:每个人向所有喜欢的对象分别连一条边,最大独立数=总人数-最大匹配数。把一个人看作两个,即二分图左边的与右边的,总人数为2n,最后结果也要除以2。代码(780K,1579MS):#include #include #include #include #include原创 2015-01-13 19:54:47 · 596 阅读 · 0 评论 -
poj1325 Machine Schedule (最小点覆盖 二分图匹配)
题意:有一些两个机器A和B,分别有n种模式和m种模式,现在有k个任务,每个任务可以在A机器的x模式下完成,也可以在B机器的y模式下完成。A和B一开始都是模式0,每变换一次模式要重启一次,问最少重启的次数。思路:对于每个任务i,设它可以在A的x模式完成也可以在B的y模式完成,则从x到y连一条有向边,问最少需要多少点能覆盖所有的边。对于二分图,最小点覆盖=最大匹配数,但是注原创 2015-01-13 19:39:44 · 616 阅读 · 0 评论 -
poj1724 ROADS (spfa + A*)
题意:给定一个有向图,每条边有一个花费,问在不超过总承受能力k的前提下,最短路为多少。思路:此题和求第k短路很像。先求最短路,如果花费超出了在求次短路,超出了再求第3短路……如何每次求出当前的最短路呢?设当前节点为x,路程为x.dist,假设从x可以扩展到两个节点i,j,设从i到终点的最短路为d[i],从j到终点的最短路为d[j],若i.dist + d[i]原创 2015-01-13 21:01:13 · 841 阅读 · 0 评论 -
poj1251 Jungle Roads (最小生成树)
模板题,话不多说上代码:#include #include #include #include #include using namespace std;struct Edge{ int from, to, v; Edge(int a, int b, int c) : from(a), to(b), v(c) {} bool operator < (const Edge原创 2015-01-13 18:43:25 · 505 阅读 · 0 评论 -
poj1275 Cashier Employment (差分约束)
题意:一家24小时营业的超市,需要雇佣一些出纳员来满足需求。超市在不同时刻需要不同数目的出纳员,记为ri (0 有n个人来申请职位,一旦雇佣一个人,他将从一个时刻ti开始,连续工作8小时。输入ri和ti,求满足需求最少需要雇佣多少人。思路:设r[i]为每小时需要的出纳员数目,t[i]为每小时应征者的数目,s[i]为从时刻0到时刻i雇佣的出纳员总数,sum为雇佣的所有原创 2015-01-13 18:47:17 · 541 阅读 · 0 评论 -
poj1716 Integer Intervals (差分约束)
题意:给定n个区间,要求选一些数,使得每个区间最少包含两个数。问最少要选几个数。思路:设s[i]为从0到i选了几个数,对于每一个区间[l, r],可知:s[r] - s[l - 1] >= 2s[i] - s[i - 1] >= 0s[i] - s[i - 1] 根据这几个不等式建图,然后求最长路。代码(1384K,1000MS):#include原创 2015-01-13 20:55:01 · 644 阅读 · 0 评论 -
poj1637 Sightseeing tour (混合图欧拉回路)
有向图存在欧拉回路的条件:所有点入度=出度。对于混合图,可以先把所有的无向边假设一个方向。但是所有的假设不一定都正确,此时需要调整边的方向。怎样调整呢?这是就要使用网络流。设每个点入度为in[i],出度为out[i],对于每一个点i,如果in[i] > out[i],从源点到i连一条容量为(in[i] - out[i]) / 2的边,如果out[i] > in[i],从i到原创 2015-01-13 20:38:28 · 425 阅读 · 0 评论 -
poj1847 Tram SPFA
题意:火车从s开到t,其中有很多岔路口,每个岔路口都能到达一些点,默认到达的点为该行读入的第一个数字。每个岔路口都可以改变前进的方向,每改变一次代价为1(对于每个岔路口,只要改变了方向,不论改变到哪里代价都是1)。问从s到t最少的代价是多少。思路:每个节点与所有可到达节点之间连边,与初始指向节点的权值为0,与其余可到达的节点的权值为1。然后求最短路。代码原创 2015-01-20 11:04:34 · 969 阅读 · 0 评论 -
poj1797 Heavy Transportation spfa变形
题意:给定一个无向图,求从1到n的路径上的最小值的最大值。就是说,从1到n可能有多条路径,每条路径上都有一个权值最小的边,问这些边的最大值。思路:以前spfa的dist数组记录的是距离,现在只要改成从源点到i的最小值。原版的spfa扩展节点:for (int i = 0; i < edges[cur].size(); i++) { Edge e = edges[c原创 2015-01-20 10:53:51 · 1459 阅读 · 1 评论 -
poj1789 Truck History 最小生成树
题意:用一个7为的字符串代表一个卡车的编号,每两个字符串的差异值为它们不同的字母的位数。如:abaaaaaaabaaaa的差异值为2,因为他们有两位不同。每个卡车的编号可以由其他编号变换过来,代价为它们的差异值。为要生成所有的编号,最小的代价为多少。思路:本题可以转化成最小生成树。每个节点代表一个编号,与其他所有节点连边,权值为代价。可见,最小原创 2015-01-20 10:43:27 · 621 阅读 · 0 评论 -
bzoj 2437 [Noi2011]兔兔与蛋蛋 [二分图匹配]
描述这些天,兔兔和蛋蛋喜欢上了一种新的棋类游戏。这个游戏是在一个 n 行 m 列的棋盘上进行的。游戏开始之前,棋盘上有一个格子是空的,其它的格子中都放置了一枚棋子,棋子或者是黑色,或者是白色。每一局游戏总是兔兔先操作,之后双方轮流操作,具体操作为:兔兔每次操作时,选择一枚与空格相邻的白色棋子,将它移进空格。蛋蛋每次操作时,选择一枚与空格相邻的黑色棋子,将它移进空格。第一个不能按照规则操作原创 2015-06-03 11:31:58 · 1716 阅读 · 0 评论