图论
文章平均质量分 80
普通网友
这个作者很懒,什么都没留下…
展开
-
POJ 2942 Knights of the Round Table
用了好几天的时间,终于把这一块的知识弄懂了..... 题目大意:N个骑士中某些骑士之间会有仇恨。骑士们开会时围坐在一个圆桌旁。一次会议能够举行,当且仅当没有相邻的两个骑士相互仇恨,且开会人数为大于2的奇数。若某个骑士任何会议都不能参加,那么就必须将它踢出。给出骑士之间的仇恨关系,问需要踢出多少个骑士。 解题思路:先将所有的骑士看成一个点,如果两个骑士间有仇恨,那么他们之间就连一条边,这样就形成了一个有n个点的图,然后我们再求出此图的补图。显然这个补图中相连的两个点是不存在仇原创 2010-09-01 19:02:00 · 916 阅读 · 0 评论 -
URAL1056 Computer net
<br />先求出树的直径(从一点DFS找最远点,再从最远点DFS找最远点,两个最远点的距离为直径)。然后由一条直径的两个端点分别标记距它们不超过(直径+1)/2的点,两次都被标记的就输出。<br /> <br />#include <iostream> #include <cstdio> #include <cstring> #define HEAD 10002 #define EDGE 20004 using namespace std; int n; int e=0,pnt[EDGE原创 2011-04-11 22:05:00 · 348 阅读 · 0 评论 -
HDU 3691 Nubulsa Expo
<br />【题目大意】<br />给定一个无向连通图和一个源点,让你选一个汇点,使得源点到汇点的最大流最小。输出这时的最大流流量。<br />【算法分析】<br />实际上就是求全局最小割。给的那个源点是废的,因为如果图被分割开了,无论当前这个源点在那一块,总有一个汇点在另外一块。所以可以无视他给的源点。<br />然后直接套Stoer-Wagner算法就可以了。转载 2011-04-02 23:18:00 · 950 阅读 · 0 评论 -
Ural 1449 Credit Operations 2
给定一个N*N矩阵T,要求出两组值a[1..N],b[1..N],使得T[i,j]这道题考察了KM算法的知识,把矩阵的元素值看作二分图的边权值,我们要求的实际上就是KM算法中用到的顶标!原创 2010-11-09 19:18:00 · 582 阅读 · 0 评论 -
Ural 1280. Topological Sorting
<br /> 这道题应该算是水题,但一开始想的算法却不是很好,从时间效率上应该能过,但就是超时,好的思路是将课的先后顺序记下,然后记下每门课是在第几次被学,如果发现与课的先后有矛盾,则NO。<br />#include <iostream> #include <cstdio> #include <cstring> using namespace std; int map[100002][2]; int idx[1002]; int main(void) { int原创 2010-11-08 19:45:00 · 450 阅读 · 0 评论 -
Ural 1106. Two Teams
<br /> 一种思路是从按照从1到N的顺序,将还没有被放置的人放置在Team1中,将他的朋友全部放在Team2中,不能分成两组当且仅当有人没朋友。现在,只需要证明,当把一个人放在Team1时,他必然有朋友在Team2中或者未被放置。用反证法证明,如果把一个人I放在Team1时,他的所有朋友都已经把放在Team1了,那么,I就肯定已经被放在Team2里了。与把I放在Team1的条件“还没有被放置”矛盾。<br /> 另一种思路是将每个人看成一个节点,如果两人是朋友,在这两人之间加边,然后按原创 2010-11-07 10:35:00 · 529 阅读 · 0 评论 -
Ural 1136. Parliament
<br /> 应该算是一道数据结构题吧,但是放到了ural的图论专区了,给出一棵二叉搜索树按左、右、中的顺序输出的序列,求按右、左、中顺序输出的序列。解法是对于二叉搜索树后序输出的序列,将序列从后到前的顺序加入二叉搜索树,就可以还原出树来(同样对于先序的序列,可以从前到后加入),建好树后,再按右、左、中顺序输出,就可以了。当然,也可以不建树,直接递归模拟出来。<br />#include <cstdio> using namespace std; int dat[3002]; bool原创 2010-11-04 19:37:00 · 547 阅读 · 0 评论 -
pku 3308 Paratroopers
这是一道最小点覆盖问题,以前也做过类似的,但那道题没有权值,做法是点数减去二分图匹配数(如果构图时重复计算了,二分匹配数别忘了除2)。而这道题有权值,方法是加入超级源点和超级汇点,源点和所有行节点相连,所有列节点和汇点相连,权值为行或列的花费,如果a行b列有敌人,则把节点a和节点b相连,权值为无穷大。现在求源点和汇点之间的最小割,即最大流。 还有一个需要注意的地方是,这里问题是要求cost的乘积,可以通过使用log()把乘法先转换为加法,最后输出的时候再用exp()转换回去。原创 2010-10-06 16:50:00 · 485 阅读 · 0 评论