题目:有一场婚礼,有n对夫妇参加,他们之间有些人之间有奸情(可能同性),在场的人中有一个公主,
她清楚其他人的人际关系,问能否安排座位使得两边都是n个人,且公主看不见有奸情的人同时在的对面。
分析:2-SAT。直接按照看的流程敲的程序。
1.建图,矛盾的点建立对应的边(与一直关系相反);
2.利用Tarjan算法计算...
分类:
其他好文 时间:
2014-07-08 12:52:46
阅读次数:
420
有向图强连通分量的Tarjan算法[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected ...
分类:
其他好文 时间:
2014-07-06 19:10:46
阅读次数:
230
题目要求一个最大的弱联通图。
首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构。
对新图进行记忆化dp,求一条权值最长的链,每个点的权值就是当前强连通分量点的个数。
/*
Tarjan算法求有向图的强连通分量set记录了强连通分量
Col记录了强连通分量的个数。
*/
#include
#include
#include
#include
#include
usin...
分类:
其他好文 时间:
2014-06-27 10:12:12
阅读次数:
275
本题分两步:
1 使用Tarjan算法求所有最大子强连通图,并且标志出来
2 然后遍历这些节点看是否有出射的边,没有的顶点所在的子强连通图的所有点,都是解集。
Tarjan算法就是模板算法了。
这里使用一个数组和一个标识号,就可以记录这个顶点是属于哪个子强连通图的了。
然后使用DFS递归搜索所有点及其边,如果有边的另一个顶点不属于本子强连通图,那么就说明有出射的边。
有难度的题目:
...
分类:
其他好文 时间:
2014-06-25 07:19:31
阅读次数:
241
Tarjan算法。1.若u为根,且度大于1,则为割点2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边)3.若low[v]>dfn[u],则边(u,v)为桥(封死在子树内),不操作。求割点时,枚举所有与当前点u相连的点v:1.是重边: 忽略2.是树边: T...
分类:
其他好文 时间:
2014-06-15 11:46:09
阅读次数:
165
关于tarjan的思想可以在网上搜到,具体我也不太清楚,应该说自己理解也不深,下面是做题经验得到的一些模板。其中有很多转载,包括BYVoid等,感谢让我转。。。望各路大神愿谅有向图求连通分量的一般方法:
1 void Tarjan(u) { 2 dfn[u]=low[u]=++index 3...
分类:
其他好文 时间:
2014-06-13 16:14:11
阅读次数:
395
在有向图 G 中,若两个顶点相互可达,则称两个顶点强连通(strongly
connected)。
如果有向图G的每两个顶点都强连通,称G是一个强连通图。
非强连通图有向图的极大强连通子图,称为强连通分量(strongly
connected components)。
比如下面第一幅图
( a, b, e ), ( d, c, h ), ( f, g ) 分别为三个 SCC。...
分类:
其他好文 时间:
2014-06-08 15:24:15
阅读次数:
300
tarjan算法第一题
喷我一脸。。。。把手写栈的类型开成了BOOL,一直在找错。。。
#include
#include
#include
#include
#define maxn 100005
const int MOD=1000000007;
using namespace std;
struct node
{
int to,next;
}edge[maxn...
分类:
其他好文 时间:
2014-05-15 08:18:56
阅读次数:
353
这题昨晚做了,刚开始看题的时候没想出好法子,然后就看D题了,一看D题发现是后缀数组,然后就把模板改了点就交了上去……不幸的是……WA了,然后重新看题,果然题目看漏了……不仅要用后缀数组和前缀数组求出公共子缀,还要是求最小的,而且在每个串里都不能重复的,这下就想了会不会了,然后看见大帝C过了,然后就重新回来看C了,看了会终于明天怎么做了。
C题意:给个图,然后每个点都有权值,求最小的花费及方案数;...
分类:
其他好文 时间:
2014-05-03 21:44:35
阅读次数:
260