给定一个有向图,问最少增加多少条边后变成强连通图
     tarjan求求强连通分量并缩点,如果强连通分量个数为1,则需要边数为0,
   否则为缩点后点入度和出度的最大值,
   证明:当入度或者出度不为0时,则可以通过传递性使其相同,所以只需要考虑入度或者出度为0的点
   即可。因为要求增加尽量少的边,所以将入度和出度都为0的点相连,边的方向为出度为0的指向入度为0的顶点。
   当入度为0或者出度为0的点有剩余时,则任意取一个点进行连边。
    所以当有向图为强连通图时答案为0,否则最小值为入度和入度的最大值

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 20005;
const int maxm = 100005;
struct node{
int v,next;
}edge[maxm];
int head[maxn],low[maxn],dfn[maxn],sta[maxn],in[maxn],out[maxn],belong[maxn],vis[maxm];
int Time,id,top,num,total;
void add_edge(int u,int v){
edge[id].v = v;edge[id].next = head[u];head[u] = id++;
}
void tarjan(int u){
low[u] = dfn[u] = ++Time;
sta[top++] = u;in[u] = 1;
for(int id = head[u]; id != -1; id = edge[id].next){
int v = edge[id].v;
if(!dfn[v]){
tarjan(v);
if( low[u] < low[v])total++;
low[u] = min(low[u],low[v]);
}
else if( in[v] )low[u] = min(low[u],low[v]);
}
if( low[u] == dfn[u]){
num ++;
do{
int t = sta[--top];
in[t] = 0;
belong[t] = num;
}while( sta[top] != u);
}
}
int main(){ int t;
int n,m;
int u,v;
int cnt;
scanf("%d",&t);
while( t-- ){
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head)),id = 0;
while( m-- ){
scanf("%d%d",&u,&v);
add_edge(u,v);
}
memset(dfn,0,sizeof(dfn));
Time = num = total = cnt = 0;
for(int i = 1; i <= n;i++){
if(!dfn[i])
tarjan(i);
}
if( num == 1){puts("0");continue;}
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
for(int u = 1; u <= n; u++){
for(int id = head[u]; id != -1; id = edge[id].next){
int v = edge[id].v;
if( belong[u] != belong[v]){
in[belong[v]]++;out[belong[u]]++;
}
}
}
int indeg = 0,outdeg = 0;
for(int i = 1; i <= num; i++){
if( !in[i])indeg ++;
if( !out[i])outdeg++;
}
printf("%d\n",indeg > outdeg ? indeg : outdeg);
}
return 0;
}

HDU2767Proving Equivalences tarjan缩点,如何求入度和出度最大值的更多相关文章

  1. 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路

    题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...

  2. HDU4612+Tarjan缩点+BFS求树的直径

    tarjan+缩点+树的直径题意:给出n个点和m条边的图,存在重边,问加一条边以后,剩下的桥的数量最少为多少.先tarjan缩点,再在这棵树上求直径.加的边即是连接这条直径的两端. /* tarjan ...

  3. LG2272/BZOJ1093 「ZJOI2007」最大半连通子图 Tarjan缩点+DAG求最长链

    问题描述 LG2272 BZOJ1093 题解 观察半联通的定义,发现图中的一些结点,构成的链一定是一个半联通子图. 此时存在的环可能会干扰求解,于是\(\mathrm{Tarjan}\)缩点. 于是 ...

  4. hdu2767 Proving Equivalences Tarjan缩点

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  5. Tarjan缩点求入度为零的点的个数问题

    Description: 一堆人需要联系,但如果x 可以联系 y,你联系了x就不用联系y了,你联系一个人都会有固定的花费,问你最小联系多少人,和最小花费 Solution: Tarjan缩点,求出缩点 ...

  6. HDU 2767 Proving Equivalences(强连通 Tarjan+缩点)

    Consider the following exercise, found in a generic linear algebra textbook. Let A be an n × n matri ...

  7. P2746 [USACO5.3]校园网Network of Schools tarjan 缩点

    题意 给出一个有向图,A任务:求最少需要从几个点送入信息,使得信息可以通过有向图走遍每一个点B任务:求最少需要加入几条边,使得有向图是一个强联通分量 思路 任务A,比较好想,可以通过tarjan缩点, ...

  8. tarjan 缩点 + 几道例题

    tarjan 缩点 + 几道例题 tarjan 模板 #include <iostream> #include <string.h> using namespace std; ...

  9. P2341 [HAOI2006]受欢迎的牛(tarjan+缩点)

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...

随机推荐

  1. SQL注入详解及技巧

    Tip小技巧 :在白盒测试的过程中,在sql语句的下一句加上 echo $sql. '<br>'; 可以在页面中输出完整的sql语句 效果图 :

  2. 【Python】Django 的邮件引擎用法详解!!(调用163邮箱为例)

    1. send_mall()方法介绍 位置: 在django.core.mail模块提供了send_mail()来发送邮件. 方法参数: send_mail(subject, message, fro ...

  3. FormLayout and FormData

    FormLayout通过为小窗口部件创建四边的Form附加值(attachment)来进行工作,并且把这些Form附加值存储在布局数据中.一个附加值让一个小窗口部件指定的一边粘贴(attach)到父C ...

  4. 放出一批jsp图书管理系统图书借阅系统源码代码运行

    基于jsp+mysql的JSP图书销售管理系统 https://www.icodedock.com/article/105.html基于jsp+Spring+Spring MVC的Spring图书借阅 ...

  5. EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换

    目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...

  6. Eclipse+CXF框架开发Web服务实战

    一. 说明 采用CXF框架开发webservice. 所用软件及版本如下.  操作系统:Window XP SP3.  JDK:JDK1.6.0_07,http://www.oracle.com/ ...

  7. JavaWeb——JSP开发2

    使用JSP+Servlet实现文件的上传和下载功能 1.文件模型 首先是文件本身,这里创建一个类记录文件的名字和内容: public class Attachment { private String ...

  8. 精准测试与开源工具Jacoco的覆盖率能力大PK

    导读:本文根据实际使用情况,简要分析了精准测试和类Jacoco等传统白盒工具在设计理念.功能和应用场景的异同点,并阐述了覆盖率技术如何在新型企业开发体系中,发挥应有的重要作用. 覆盖率技术可以说是测试 ...

  9. 【0801 | Day 6】Python基础(四)

    Part 13 流程控制之while循环 一.语法 while 条件 code 1 code 2 code 3 ... ​ while True: print('*1'*100) print('*2' ...

  10. python自动化运维技术读书笔记

    import psutilprint(psutil.cpu_times(percpu=True)) #使用cpu_times方法获取CPU完整信息需要显示所有逻辑CPU信息 import psutil ...