随笔分类 - 图论——trajan算法
摘要:题意:给你一个n个点,m条有向边的图,然后给你k个操作,每次把第i个边改变成无向边。然后求该图的强连通块里面点数最多的值思路:首先bfs求出每个点可达的边,然后tarjan求出强连通块。每次改变边时,如果这条边的两个端点在同一连通块(u,v),直接输出最多。如果不在同一连通块,首先加上这两个连通块的个数组成新的连通块,然后枚举i u->i ,i>v满足,然后i不属于u或者v的连通块,然后加上该连通块数量即可。#include <iostream>#include <cstdio>#include <cmath>#include <vecto
阅读全文
摘要:题意:有n个人玩老鹰捉小鸡游戏,每个人都像当老鹰,于是他们决定投票选举,每个人都有一票,不可以投自己。票具有传递性假设A投给了B,B有又给了C则C就会得到两票。求得到票数最多的票数及每个人的编号(0-n-1)思路:其实划一划图就会发现,每个人得到的票数即为能够到达该点点数,中间可能存在环。如果五环的话,我们只要倒着建图,然后找出入度为0的点,搜索他能到达的点的个数即为该点所得到的票数,因为最优值一定在入度为0的点上。 如果存在环的话,我们只需要通过tarjan缩点,改环所能提供的票数为该环内的点数。然后再重新倒着建图就好了。View Code #include <iostream>
阅读全文
摘要:http://poj.org/problem?id=3114/*这道题和3592非常类似,所以做了那道题后再做这道就有感觉了,自己写的而且1Y好开心的样子,哈哈.....题意:战争期间国家之间的通信,给定n个城市,m个城市之间的可传输协议。如果若干个城市强连通则说明他们属于同一个国家股他们之间的通信可立即到达,消耗时间为0,否则就要消耗指定的时间h了。给定k个询问x,y问由x到y的最小耗费时间。思路:首先根据给定m个协议,构建图,然后求强连通分量缩点,将缩点后的图,重新建立,如果属于同一国家他们之间的权值就变为0,不属于同于国家权值仍为h。然后就是spfa求最短路了;*/#include &l
阅读全文
摘要:http://poj.org/problem?id=3592/*题意:给定一个n*m的矩阵,你从左上角出发,规定只能往当前点的右边或者下边走,其中还有一些特殊点*具有特殊的力量可以把你传到特定的一个点(你可以选择传送也可以选择不传送),问从左上角出发到不能走下去,最多能获得的矿石量(每个方格对应着一个数字表示矿石数量)。点#直接跳过思路:首先build1根据题意描述,见图,将二位矩阵转化为一维的点建图,每个点可以向右向下建立有向边,点*还可以向传送点建边。建完后tarjan缩点,然后在根据缩点后的点建图,添加超级源点s,权值为i-j sum[j], 求最长路即可的结果;中间数组开成了44贡献.
阅读全文
摘要:以前接触过的算法,现在拾起来还是有些费劲,只能说没有掌握牢固吧:双连通分量:pku 3694Networkhttp://poj.org/problem?id=3694 以前做过的一道题目:http://www.cnblogs.com/E-star/archive/2012/02/15/2353157.html又熟悉了一遍;pku 2942 比较麻烦,先搁着吧:缩点题目:pku 2186Popular Cowshttp://poj.org/problem?id=2186题意:给出n个牛,以及m个羡慕关系,找出最受羡慕的牛,该牛满足其他n-1个牛,都会羡慕它(直接羡慕或者间接羡慕);思路:将强连通
阅读全文
摘要:http://poj.org/problem?id=3020求最小路径覆盖问题 ,对于有向图最小路径覆盖 = 一边的点数 (x集或y集)- 最大匹配无向图最小路径覆盖 = 一边的点数 (x集或y集)- 最大匹配/2注意建图的细节实现。。。还有注意转化点后的取值。。View Code #include <iostream>#include <cstring>#include <cstdio>#define maxn 45using namespace std;int map[maxn*15][maxn*15],num[maxn][15];//注意这里的map坐
阅读全文
摘要:http://poj.org/problem?id=3694给你一个存在桥的无向连通图,每次增加一条边,问每次增加边之后还剩多少个桥。朴素的办法就是每输入一次tarjan求一次桥的个数,肯定会tle;正确的做发是,首先求出改图的桥的数量,在tarjan的过程中里用并查集把不是桥的边缩为一点,然后得到一棵树,每加入一条边,就肯定会形成一个环,,然后删除环中石桥的边,最后得出总的桥的数量。删除的过程就是检查是否石桥是就有cut--;View Code #include <cstdio>#include <cstring>#include <vector>#inc
阅读全文
摘要:http://poj.org/problem?id=3177http://poj.org/problem?id=3352把3177的代码直接贴到3352也就a了。3177:题意是给一个图,注意这里有重边,问至少添加多少条边才能使是该图成为边双连通图。首先求出该图中的割边(桥)然后删除桥,剩下的就都是边双连通分量了,然后将其缩成一个点,再把桥加上就死形成了一棵树,边连通度为1.记录叶子节点数ans,则至少添加(ans+1)/2个节点才能使原图成为边双连通图。此时low[]值相同的是同一个连通分量,注意在求tarjan是不能染low[i]取到low[ifather]的值,这样整个图的low[i]就
阅读全文
摘要:http://poj.org/problem?id=1904很多人都说是二分匹配题目,可是我还没有接触他呢。悲剧啊。不过这道题要求强连通分量做。king有n个儿子,这边有n个beautiful mm,每个儿子可以喜欢多个mm,但是只能和一个结婚。最后king的wizard给出了一个完美匹配。可是国王比较定眼,想知道每个儿子所有可以结婚的情况。儿子编号(1,n) mm编号(n+1, 2*n),儿子喜欢mm就建立一条边 u ->v 如果儿子取了mm 在建立一条边 v->u然后求强连通分量,在一个强连通分量里的是他所有可能结婚的情况View Code #include <iostr
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3836缩点后求每个点的入度与出度,最后结果是max(入度为0的点的个数,出度为0的点的个数);只要整个图形成强连通图就可以证明了。。今天真二把tarjian模板写错了,贡献了好几次wa竟然没有检查出来。。。。唉。。。View Code #include <cstdio>#include <cstring>#include <iostream>#include <vector>#include <stack>#define maxn 20007usin
阅读全文
摘要:http://poj.org/problem?id=2553题意才开始理解错了一位G中的任意一点都能到达v且v也能达到该点时v才属于bottom;如果这样最后出度为0的比为一个了,而且整个图都要缩为一点了。其实题意是说w属于G如果v->w ==>(推出)w->v则v属于bottom。先缩点,然后统计出度为0的点,然后输出所有出度为0的点包含的点。如果出度不为0,那么v->w退不出w->v这里的DAG比存在出度为0的点。。。所以都骂出题的二逼啊。。。View Code #include <cstdio>#include <cstring>#i
阅读全文
摘要:http://poj.org/problem?id=2186将所有最大连通分量缩点,然后统计缩点后每个点的出度,出度为0的肯定就是了可是这个点可能是缩出来的,所以要记录这个点真正包含的点数。如果出度为0的点大于1个说明不存在View Code 稍微尝试了一下stl的vector和stack#include <cstdio>#include <cstring>#include <vector>#include <stack>#include <iostream>#define maxn 10017using namespace std;
阅读全文
摘要:http://poj.org/problem?id=2117给出一个森林,求删掉一个点后,形成的连通块的个数。和pku1523一样的意思,只不过这里是森林了。。还要加上原来的连通块数。注意:这里的当m == 0 时要单独考虑,因为要删掉一个点,所以== n-1 而单纯的求的话是n了。。。View Code #include <cstdio>#include <cstring>#include <iostream>#define maxn 10010using namespace std;struct node{ int v; int next;}g[4*ma
阅读全文
摘要:http://poj.org/problem?id=1523求一个无向图的割点,以及输出删除该割点后形成的连通块数(删掉一个割点后会形成两个连通分块)今天脑子被驴了。晕晕的。。。这样一个模板题整了一上午,各种粗心错误,敲了好几遍,现在看到tarjan就恶心。。。View Code #include <cstdio>#include <cstring>#include <iostream>#define maxn 1007using namespace std;struct node{ int v; int next;}g[maxn*4];int low[ma
阅读全文