等价性问题,给出的样例为 a->b的形式,问要实现全部等价(即任意两个可以互相推出),至少要加多少个形如 a->b的条件. 容易想到用强连通缩点,把已经实现等价的子图缩掉,最后剩余DAG.要推出一个方案,YY后取“出度为零”和“入度为零”的点数的较大值. 理由:假定出度为零的点数较多,即是我们通常意义上的树的形式(当然,DAG是图,这里只是类比). 根可以推出其所有子孙,事实上任意一个点都可以推出其子孙,那么只要让该节点推出树根,就可以推出整棵树上所有的节点了.那么多棵树为什么不是相乘呢?,借…
原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2288 题意: 给你一个有向图,问你至少需要添加多少条边,使得整个图强连通. 题解: 就..直接缩点,令缩点后入度为0的点有a个,出度为0的点有b个,答案就是max(a,b) 代码: #include<iostream> #include<cstri…
Problem   UVALive - 4287 - Proving Equivalences Time Limit: 3000 mSec Problem Description Input Output Sample Input 2 4 0 3 2 1 2 1 3 Sample Output 4 2 题解:题意就是给出一个有向图,问最少添加几条有向边能够使得整张图强连通,Tarjan缩点是比较容易想到的,之后怎么办,要用到一个结论:如果图中有a个入度为零的点,b个出度为零的点,那么max(a,…
题意:给定一个图,问至少加入多少条边能够使这个图强连通. 思路:首先求出这个图的强连通分量.然后把每个强连通分量缩成一个点.那么这个图变成了一个DAG,求出全部点的入度和出度,由于强连通图中每个节点的入度和出度至少为1.那么我们求出入度为零的节点数量和出度为零的节点数量.答案取最大值,由于在一个DAG中加入这么多边一定能够使这个图强连通.注意当这个图本身强连通时要特判一下,答案为零. #include<cstdio> #include<cstring> #include<cm…
给定n个命题之间的已经证明的关系如 a b表示已经证明蕴含式a→b,要求还需要再作多少次证明使得所有的命题都是等价的.将每个命题看成一个点,已经证明的命题之间连一条边,问题转化为添加多少条单向边使得图成为一个强连通分量. 先求出所有的强连通分量,然后缩点构成一个SCC图,统计其中入度为0的点个数a,以及出度为0的点的个数b,max(a,b)就是需要再作的证明.注意当图一开始就是强连通时,不需要作出证明了. 来自刘汝佳算法训练指南代码: #include <iostream> #include…
layout: post title: 训练指南 UVALive - 4287 (强连通分量+缩点) author: "luowentaoaa" catalog: true mathjax: true tags: - 强连通分量 - 图论 - 训练指南 Proving Equivalences UVALive - 4287 题意 有n个命题,已知其中的m个推导,要证明n个命题全部等价(等价具有传递性),最少还需要做出几次推导. 题解 由已知的推导可以建一张无向图,则问题变成了最少需要增…
Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4343    Accepted Submission(s): 1541 Problem Description Consider the following exercise, found in a generic linear algebra textbook. Let A be an…
给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进来的边(这样才干保证它能到随意点和随意点都能到它) 所以求出新图中入度为0的个数,和出度为0的个数,加入的边就是从出度为0的指向入度为0的.这样还会有一点剩余,剩余的就乱连即可了. 所以仅仅要求出2者的最大值就OK. #include <iostream> #include<cstring&…
把证明的关系看出一张图,最终就是要所有的点都在至少一个环中.环的判断和度数有关. 用tarjan找强连通分量,在一个强连通分量点已经等价缩点以后形成一个DAG,计算入度为0的点数a, 出度为0的b,取其中大的一个.特判强连通分量数为1的情况. 看懂tarjan算法以后还是比较简单的 #include<bits/stdc++.h> using namespace std; ; ; int head[maxn],nxt[maxm],to[maxm],ecnt; void addEdge(int u…
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4263    Accepted Submission(s): 1510 Problem Description Consider the following exercise, found in a generic linear algebra t…