POJ 1236 强联通分量

点击打开链接

题意:每个点可以传输给下一个点,第一问问你最小需要多少个点就可以将所有点都传输到,第二问问你我只传输给一个点,问最少加几条边,使得所有点可以传输

思路:只要一个点的入度为0,那么这个点一定是第一问中要传输的点,所以统计入度为1的点的个数就是第一问,第二问问你加多少边,我们要加入的边就是入度为0的点数和出度为0的点数的最大值,与这题hdu 3836相似,一个缩过点后的图要想联通的话,那么每个点都要至少有一个入度和一个出度,所以我们要想将图联通,那么加入的边就是上面所说的,但是如果这题的刚开始强联通分量就是1的话,我们还是要传输给一个点,但是我们不需要加边,所以输出1 0

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=110;
vector G[maxn];
vector rG[maxn];
vector=0;i--){
        if(!used[vs[i]]) rdfs(vs[i],k++);
    }
    return k;
}
int vis1[maxn],vis2[maxn];
int main(){
    int a,b,c;
    while(scanf("%d",&V)!=-1){
        memset(vis1,0,sizeof(vis1));
        memset(vis2,0,sizeof(vis2));
        memset(vis,0,sizeof(vis));
        memset(ans1,0,sizeof(ans1));
        memset(ans2,0,sizeof(ans2));
        for(int i=0;i

你可能感兴趣的:(ACM,强联通,图论,poj,图论,强联通分量,线段树)