随笔分类 -  图论

摘要:链接:http://wikioi.com/problem/1036/题意不写了。思路:很明显找到lca然后用两个点的深度相加-lca的深度就是这一步的最近步数。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define loop(s,i,n) for(i = s;i g[maxn]; 16 int find(int x) 17 { 18 if(set[x] != x) 19 set[x] = find(set[x]); 20 21 ... 阅读全文
posted @ 2013-10-03 00:48 某某。 阅读(266) 评论(0) 推荐(0)
摘要:链接:http://wikioi.com/problem/1021/这题挺有意思的,虽然比较水,但是让我想起来那次百度or腾讯的一道最大流的题目,很给力,也是对最后找边进行优化,不过这题比那题简单多了,找出最短路,然后对最短路上的变进行一下标记,最后找边的时候只招最短路上的边就可以了。代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define loop(s,i,n) for(i = s;i q;42 q... 阅读全文
posted @ 2013-09-27 14:14 某某。 阅读(272) 评论(0) 推荐(0)
摘要:链接:http://wikioi.com/problem/1035/怎么说呢,只能说这个建图很有意思。因为只有m条道,然后能互相接在一起的连通,对每个点进行拆点,很有意思的一道裸费用留题。代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 const int maxn = 350; 9 const int inf = 10000000; 10 struct node 11 { 12 int u,v,cap,flow,co... 阅读全文
posted @ 2013-09-27 14:10 某某。 阅读(195) 评论(0) 推荐(0)
摘要:中文题意不描述。链接:http://wikioi.com/problem/1028/这题一开始很裸的最大权二分匹配。但是原来没有接触过,KM的这个最大权不大会。然后一开始以为用最大费用最大流直接就能搞,后来知道单纯的费用流解决的是二分最佳匹配,而不是最大权,QCMM然后看了一下这个http://hi.baidu.com/lerroy312/item/42e718ba58a1f8df85dd795f结果改了之后不对,不知道为什么最后用的最小费用,对边的权值取负值,结果取负值才过。。。不解。。。 1 #include 2 #include 3 #include 4 #include ... 阅读全文
posted @ 2013-09-27 14:06 某某。 阅读(487) 评论(0) 推荐(0)
摘要:题意:给你N 城市和M条道路,每条道路要付的钱,但是如果你在这个道路上你可以付其他道路的钱(跟走到的时候去的话不一样),问你从1走到N最少话费是多少。直接DFS搜。链接http://poj.org/problem?id=3411代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define loop(s,i,n) for(i = s;i g[15];19 int vis[15];20 int ans;21 int n,m;22 void ... 阅读全文
posted @ 2013-08-16 16:10 某某。 阅读(262) 评论(0) 推荐(0)
摘要:题意:给你N个城市和M条路和K块钱,每条路有话费,问你从1走到N的在K块钱内所能走的最短距离是多少链接:http://poj.org/problem?id=1724直接dfs搜一遍就是代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define loop(s,i,n) for(i = s;i dis)31 ans = dis;32 return ;33 }34 35 if(ans < di... 阅读全文
posted @ 2013-08-16 16:07 某某。 阅读(197) 评论(0) 推荐(0)
摘要:题意:有一个n*m的矩阵,告诉了在每一行或者每一列安装大炮的代价,每一个大炮可以瞬间消灭这一行或者这一列的所有敌人,然后告诉了敌人可能出现的L个坐标位置,问如何安置大炮,使花费最小。如果一个敌人位于第r行c列,则他可以被第r行或者第c列的大炮消灭。链接:http://poj.org/problem?id=3308这题突然就让我想起来那个多校的那道多米诺骨牌的那个,几乎一样的模型,还不过要把权值改一下,因为权值是相乘,那么就吧权值改成相加,也就是用log去改变。这样的话 如果坐标为x,y的点要被消灭,那么要么走x要么走y,这样的话就直接是一个二分图的形式了。一边是行,一边是列,用出现的点连边,就 阅读全文
posted @ 2013-08-14 01:11 某某。 阅读(381) 评论(0) 推荐(0)
摘要:题目大意:给定一些城市,然后再给一些寄信的路信,A,B,H代表把信从A城市寄到B城市需要H小时。如果没有直接可以寄达的,可以先通过另外一个城市到达,比如A,B可以寄信,B,C可以寄信,那么,A,C也可以寄信。其中两个城市之间如果可以相互寄信的话,那么这两个城市是属于一个国家的,寄信可以通过电子邮件,所以所需的时间为0.题目中有K个询问,输入A,B询问A到B之间寄信最少需要多少时间。连接:http://poj.org/problem?id=3114距离为零肯定就是强连通分量嘛~。一开始是打算用的缩点FLOYD,结果超时。但是搜了一下,有人用floyd就不超时,叫秦川看了下,秦川也不晓得,他自己写 阅读全文
posted @ 2013-08-12 20:07 某某。 阅读(194) 评论(0) 推荐(0)
摘要:题意:一个连通的无向图,求至少需要添加几条边,救能保证删除任意一条边,图仍然是连通的。链接:http://poj.org/problem?id=3352思路:边的双连通图。其实就是要求至少添加几条边,可以使整个图成为一个边双连通图。用tarjan算法(求割点割边)求出low数组,这里可以简化,然 后依据“low相同的点在一个边连通分量中”,缩点之后构造成树(这里可以直接利用low[]数组,low[i]即为第i节点所在的连通分量的标号)。求 出树中出度为1的节点数left,答案即为(leaf+1)/2。代码: 1 #include 2 #include 3 #include 4 #... 阅读全文
posted @ 2013-08-12 02:23 某某。 阅读(399) 评论(0) 推荐(0)
摘要:问加一条边,最少可以剩下几个桥。先双连通分量缩点,形成一颗树,然后求树的直径,就是减少的桥。本题要处理重边的情况。如果本来就两条重边,不能算是桥。还会爆栈,只能C++交,手动加栈了别人都是用的双连通分量,我直接无向图改成有向图搞得强连通水过。 1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 10 using namespace std; ... 阅读全文
posted @ 2013-08-11 17:49 某某。 阅读(436) 评论(0) 推荐(0)
摘要:先说一下割点跟割边吧。割桥就是如果一个连通图里删除这条边之后,这个图会变成两个连通图,那么这条边就称之为割桥。这是割桥的代码,里面呆着lca求法。割点和割桥的就是用一个时间戳和回到祖先确定。用dfs的时间戳可以看出。割点为low[v] >= dfn[u]割边为low[v] > dfn[u]。但是要注意的是割点的条件对于搜索树的根节点是要特殊处理的,当根节点的孩子大于1的时候就一定是割点。 1 void tarjan(int u,int pre) 2 { 3 int v,i,j; 4 dfn[u] = low[u] = ++dfsclock; 5 loop(0,i,g[u... 阅读全文
posted @ 2013-08-11 17:14 某某。 阅读(148) 评论(0) 推荐(0)
摘要:链接:http://poj.org/problem?id=3592题意:题目大意:给定一个矩阵,西南角为出发点,每个单位都有一订价值的金矿(#默示岩石,不成达,*默示时佛门,可以达到指定单位),队#外,每个点只能向右走或向下走,并且可以反复经过一个点。如今请求得最多可以获得多大好处。一开始看到这个题,会以为是费用流。但是计划上是在tarjan上的。我觉得如果比赛的时候有这道题估计我也就挂了。因为这个图大部分的点只有两个后续节点, 但是*会有更多的节点,所以说这样会产生环,因此可以吧整个图求强连通进行缩点,因为每个强连通分量重的点你是可以得到她所有的值。不管走几次,就是那么多,缩完点之后就可以构 阅读全文
posted @ 2013-08-07 15:41 某某。 阅读(678) 评论(0) 推荐(0)
摘要:题意:告诉你一些骨牌,然后骨牌的位置与横竖,这样求最多保留多少无覆盖的方格。这样的话有人用二分匹配,因为两个必定去掉一个,我用的是最小割,因为保证横着和竖着不连通即可。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define loop(s,i,n) for(i = s;i edges; 14 vectorg[maxn],G[maxn]; 15 void addedge(int u,int v,int cap,int flow) 16 { 17 //printf("********u %d *... 阅读全文
posted @ 2013-08-03 11:03 某某。 阅读(227) 评论(0) 推荐(0)
摘要:题意:给你一个连通图,问你最多加多少条边,还能保证该图不是强连通图。对整个图求强连通分量,然后对图缩点,记录一下缩点之后每隔点包含的原来的点的个数,找出最少的那个点,然后对这个点建成完全图,对另外的所有点建成完全图。然后+两个点建边-所有原来的遍就好了。链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 using namespace std; 10 c... 阅读全文
posted @ 2013-08-03 10:54 某某。 阅读(204) 评论(0) 推荐(0)
摘要:Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html基本概念:1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点。2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。3.点连通度:最小割点集合中的顶点数。4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图。5.割边集合:如 阅读全文
posted @ 2013-07-31 14:23 某某。 阅读(2379) 评论(0) 推荐(0)
摘要:题意:给你一个连通图,然后再给你n个询问,每个询问给一个点u,v表示加上u,v之后又多少个桥。一个最容易想到的办法就是先加边找桥,加边找桥,这样可定超时。那么就可以缩点,因为如果一条边不是桥那么无论怎么加边他肯定都不会变成桥,这样我吧不是桥的点缩成一个点。这样全图就都是桥,这样的话,我们就在加的遍里面去找如果加的边是同一个点,那么,肯定不会减少桥,但是如果不是同一个,那么桥肯定减少~。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #defin... 阅读全文
posted @ 2013-07-31 14:21 某某。 阅读(579) 评论(0) 推荐(0)
摘要:题解:http://blog.csdn.net/lyy289065406/article/details/6756821讲的很详细我就不多说了。题目连接:http://poj.org/problem?id=2942代码(完全白书上的) 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define loop(s,i,n) for(i = s;i g[maxn],bcc[maxn]; 15 struct edge 16 { 17 ... 阅读全文
posted @ 2013-07-30 18:50 某某。 阅读(481) 评论(0) 推荐(0)
摘要:链接:http://poj.org/problem?id=2186题意:给你N个点,然后在给你N条有向边,然后让你找出这样的点S,S满足条件图上任意一点都能到达S。要想满足任意一点都能到达,首先满足图连通,然后满足将图缩点后形成一个棵树,树的特征是可以有且只有一个点的出度为0。然后代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 using namespace std; 10 const int maxn = 50050; 11 12 ... 阅读全文
posted @ 2013-07-29 21:39 某某。 阅读(208) 评论(0) 推荐(0)