随笔分类 -  强连通分量

摘要:给定一个有向图,问最少增加多少条边后变成强连通图 tarjan求求强连通分量并缩点,如果强连通分量个数为1,则需要边数为0, 否则为缩点后点入度和出度的最大值, 证明:当入度或者出度不为0时,则可以通过传递性使其相同,所以只需要考虑入度或者出度为0的点 即可。因为要求增加尽量少的边,所以将入度和出度都为0的点相连,边的方向为出度为0的指向入度为0的顶点。 当入度为0或者出度为0的点有剩余时,则任意取一个点进行连边。 所以当有向图为强连通图时答案为0,否则最小值为入度和入度的最大值#include #include #include #include using names... 阅读全文
posted @ 2013-09-04 20:42 一生挚爱 阅读(710) 评论(0) 推荐(0)
摘要:一开始题目没看清楚,以为是增加那条边后还有多少桥,所以就当做是无向图tarjan缩点后建树,然后求u,v的最近公共祖先,一直wa。后来再看题目后才发现边放上去后不会拿下来了,即增加i条边后桥的数量。#include #include #include #include using namespace std;const int maxn = 100100;const int maxm = 200100;struct node{ int v,next;}edge[maxm*2];int head[maxn],low[maxn],dfn[maxn],fa[maxn],stack[maxn]... 阅读全文
posted @ 2013-07-30 23:36 一生挚爱 阅读(248) 评论(0) 推荐(0)
摘要:#include #include #include using namespace std;const int maxn = 2100;struct node{ int v,next;}edge[maxn*maxn];int head[maxn],res[1005*1005][2],low[maxn],dfn[maxn],stack[maxn],in[maxn];int n,m,id,clock,top;void add_edge(int u,int v){ edge[id].v = v;edge[id].next = head[u];head[u] = id++;}void i... 阅读全文
posted @ 2013-07-29 20:03 一生挚爱 阅读(214) 评论(0) 推荐(0)
摘要:#pragma comment(linker,"/STACK:102400000,102400000")#include #include #include #include #include #include using namespace std;const int maxn = 200100;const int maxm = 2000100;struct node{ int v,next;}edge[maxm];struct Bridge{ int u,v;}bridge[maxm];int head[maxn],vis[maxm],fa[maxn],dfn[maxn 阅读全文
posted @ 2013-07-28 15:46 一生挚爱 阅读(297) 评论(0) 推荐(0)
摘要:题意: 平面上,一个圆,圆的边上按顺时针放着n个点。现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接。给你的信息中,每个点最多只会连接的一条边。问能不能连接这m条边,使这些边都不相交。解题报告:题意可能刚开始不是很好理解,比如1 5连边,2,6连边,由于点是顺序排列的,一画图就可以发现,这两条边必须一个从圆外面连,一个从内部连,否则就会相交。如果再加入3 7这条边,那么就必须相交了。这样,就可以转化成标准的2-sta问题:1:每个边看成2个点:分别表示在内部连接和在外部连接,只能选择一个。计作点i和点i'2:如果两条边i和j必须一个画在内部,一个画在外部( 阅读全文
posted @ 2013-07-27 11:00 一生挚爱 阅读(217) 评论(0) 推荐(0)