随笔分类 - 2-sat
摘要:给定一个有向图,问最少增加多少条边后变成强连通图 tarjan求求强连通分量并缩点,如果强连通分量个数为1,则需要边数为0, 否则为缩点后点入度和出度的最大值, 证明:当入度或者出度不为0时,则可以通过传递性使其相同,所以只需要考虑入度或者出度为0的点 即可。因为要求增加尽量少的边,所以将入度和出度都为0的点相连,边的方向为出度为0的指向入度为0的顶点。 当入度为0或者出度为0的点有剩余时,则任意取一个点进行连边。 所以当有向图为强连通图时答案为0,否则最小值为入度和入度的最大值#include #include #include #include using names...
阅读全文
摘要:#include #include #include #include #include using namespace std;const int maxn = 16100;struct node { int v,next;} edge[41000];int head[maxn],sta[maxn],vis[maxn];int id,top,n;void add_edge(int u,int v){ edge[id].v = v;edge[id].next = head[u];head[u] = id++;}int dfs(int u){ if( vis[u^1] )r...
阅读全文
摘要:可以把一对夫妇当成一个节点,然后拆点的话,h和w分别为真和假,然后直接按照题目中说的建图染色即可#include #include #include #include #include #include using namespace std;const int maxn = 100;const int maxm = 1000;struct node{ int v,next;}edge[maxm];int res[maxm][2],head[maxn],low[maxn],dfn[maxn],stack[maxn],in[maxn],fa[maxn],ha[maxn];int colo...
阅读全文
摘要:#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...
阅读全文
摘要:题意: 平面上,一个圆,圆的边上按顺时针放着n个点。现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接。给你的信息中,每个点最多只会连接的一条边。问能不能连接这m条边,使这些边都不相交。解题报告:题意可能刚开始不是很好理解,比如1 5连边,2,6连边,由于点是顺序排列的,一画图就可以发现,这两条边必须一个从圆外面连,一个从内部连,否则就会相交。如果再加入3 7这条边,那么就必须相交了。这样,就可以转化成标准的2-sta问题:1:每个边看成2个点:分别表示在内部连接和在外部连接,只能选择一个。计作点i和点i'2:如果两条边i和j必须一个画在内部,一个画在外部(
阅读全文

浙公网安备 33010602011771号