上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 61 下一页
摘要: 题目链接:http://poj.org/problem?id=3310思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径上的点进行标记,于是根据题意我们可以发现,如果这个图是“caterpillar”的话,那么他所有的边要么两端都在树上最长直径上,要么就是其中一端在,于是我们可以再次dfs进行判断就可以了。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 111 7 8 struct ... 阅读全文
posted @ 2013-08-25 15:13 ihge2k 阅读(534) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3308思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代价,对于每一个敌人(x,y),连边x->y,容量为inf,这样就说明选取的点覆盖了那些边(敌人),然后跑最大流求最小割即可。PS:这里是乘积最小,要取对数转化为和最小。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define MAXN 222 ... 阅读全文
posted @ 2013-08-25 11:05 ihge2k 阅读(355) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3281思路:设一个超级源点和一个超级汇点,源点与食物相连,饮料与汇点相连,然后就是对牛进行拆点,一边喜欢的食物相连,一边与喜欢的饮料相连,拆分的牛之间也连边,所有边的容量均为1.然后跑最大流就可以了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 444 8 #define MAXM 4444444 9 #define inf 1que; 39 que.push(vt... 阅读全文
posted @ 2013-08-25 10:23 ihge2k 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3275思路:对于n个节点,共有n*(n-1)/2对关系,对于给出的m对已经确定的关系,我们可以用传递闭包推出目前已经确定的关系对数ans,于是答案就是n*(n-1)/2-ans. 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 1010 8 9 vector >G_from;10 vector >G_to;11 bool map[MAXN][MAXN];12 13 int main( 阅读全文
posted @ 2013-08-24 21:35 ihge2k 阅读(353) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3204思路:显然只有增大那最小割边集上的边才能增加最大流,因此,我们可以先跑一遍最大流,然后对于那些满足条件的边u->v,当且仅当从源点开始沿着正向边能遍历到u,从汇点开始沿着正向边能遍历到v. 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 555 8 #define MAXM 55555 9 #define inf 1que; 39 que.push(vt); 40... 阅读全文
posted @ 2013-08-24 20:25 ihge2k 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3164思路:朱刘算法,模版题。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 111 8 #define inf 1v; 36 if(u==root)//记录是root从哪一条边到有效点的(这个点就是实际的起点) 37 ansi=i; 38 In[v]=edge[i].w; ... 阅读全文
posted @ 2013-08-24 16:53 ihge2k 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2987思路:标准的最大权闭合图,构图:从源点s向每个正收益点连边,容量为收益;从每个负收益点向汇点t连边,容量为收益的相反数;对于i是j的上司,连边i->j,容量为inf。最大收益 = 正收益点权和 - 最小割 = 正收益点权和 - 最大流(胡波涛论文上有证明)。这题的关键是如何在最小割的前提下求出最少的割边数目,可以从源点对残量网络进行一次DFS,每个割都会将源汇隔开,所以从源点DFS下去一定会因为碰到某个割而无法前进,用反证法易知这时遍历过的点数就是S集的最少点数。 1 #include 2 #include 3 #in 阅读全文
posted @ 2013-08-24 16:15 ihge2k 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2455思路:求1-n的路径中最长段的最小值,显然要用到二分,我们二分最长段,如果当前u,v的距离小于等于limit,则连边(双向边),边容量为1,代表只能走1次。然后就是以1为源点,n为汇点跑最大流,如果maxflow>=T,则在(low,mid)中搜索,否则就在(mid,high)中搜索。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 444 8 #define MAXM 4... 阅读全文
posted @ 2013-08-24 12:23 ihge2k 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2391思路:求最短时间,可以想到二分,然后判断可行性。首先在原图上求 floyd,得到每两个棚之间的最短距离。然后拆点:将每个棚拆为 i 和 i’(流进和流出),添边(i,i’,INF)。增加源点 s 和汇点 t,从 s 连边到 i,容量为该棚现在的猫的数量,i’连边到 t,容量为该棚的容量。若棚 i 和棚 j 之间的距离不大于 limit,则连边(i,j’,INF), (j,i’,INF)。求最大流,若从 s 发出的边均满流,则在 low 和 mid 中搜索;否则在 mid 和 high 中搜索。 1 #include 2 .. 阅读全文
posted @ 2013-08-23 21:47 ihge2k 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2135思路:把路长看作费用,然后如果u,v之间有边,就连u->v,v->u,边容量为1,表示每条边只能走一次,最后就是源点与1连边,容量为2,费用为0,n与汇点连边,容量为2,费用为0,表示增广2次。这样就转化为为最小费用最大流问题来求解了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 1010 8 #define MAXM 88888 9 #define inf 1que... 阅读全文
posted @ 2013-08-23 19:19 ihge2k 阅读(287) 评论(0) 推荐(0) 编辑
上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 61 下一页