https://www.luogu.com.cn/problem/P2746

该题简化一下就是下面两个问题:
1、最少要给多少个点发消息,才能使得所有的点都收到消息(消息可以随边传递)
2、最少需要多少条边才能使得图变成强连通图
首先我们先使用tarjan算法求出图中的强连通分量,对于一个强连通分量,可以当做一个点来考虑,所以我们可以缩点,然后得到DAG图。
那么对于第一个问,即是入度为0的点有多少个,因为入度为0的点无法收到消息。
对于第二问,只要加max(s1,s2)条边,就能使得DAG变成强连通图, s1表示入度为0的点的个数,s2表示出度为0的点的个数。设s1 > s2, 那么首先加s2条边,这s2条边连接的是入度为0和出度为0的点,然后剩下s1-s2个入度为0的点, 那么随便加s1-s2条边即可。
当然有一个特殊情况需要特判一下,当整个图原本就是一个强连通图时,缩完点之后,s1,s2都是1,但是本身不需要加边就是一个强连通图。``
AC代码:

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
int T;
int head[110],a[10010],b[10010],dfn[110],low[110],scc[110],rd[110],cd[110],f[110][110];
bool vis[110];
struct edge{int to,w,next;
}e[10010];
int cnt;
void add(int u,int v,int w){e[++cnt].to =v;e[cnt].w =w;e[cnt].next =head[u];head[u]=cnt;
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int tot,scnt=0;
stack<int>s;
void tarjan(int u){vis[u]=1;s.push(u);dfn[u]=low[u]=++tot;for(int i=head[u];i;i=e[i].next ){int v=e[i].to ;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(vis[v])low[u]=min(low[u],dfn[v]);}if(low[u]==dfn[u]){scnt++;int x;do{x=s.top();s.pop();vis[x]=0;scc[x]=scnt; }while(x!=u);}
}
int main(){int n;cin>>n;int m=0;for(int u=1;u<=n;u++){int v;while(cin>>v&&v>0){m++;a[m]=u,b[m]=v;add(u,v,1);}}for(int i=1;i<=n;i++){if(!dfn[i])tarjan(i);}int ansa=0;int ansb=0;int sum=0;if(scnt==1){ansa=1,ansb=0;}else{for(int i=1;i<=m;i++){if(scc[a[i]]!=scc[b[i]]&&!f[scc[a[i]]][scc[b[i]]]){cd[scc[a[i]]]++;rd[scc[b[i]]]++; f[scc[a[i]]][scc[b[i]]]=1;}}for(int i=1;i<=scnt;i++){if(rd[i]==0)ansa++;if(cd[i]==0)sum++;}ansb=max(ansa,sum);}cout<<ansa<<endl;cout<<ansb<<endl;return 0;
}

有向图加边成强连通图(tarjan缩点)相关推荐

  1. 浅谈Tarjan缩点(分析+模板)

    昨天一看发现我的博客数量到100篇了,撒花✿✿ヽ(°▽°)ノ✿ 根据标题我们也知道,想要在接下来的十分钟不浪费生命 读者需要先行学习Tarjan强联通分量 如果不会的话可以点击这里:https://w ...

  2. POJ 1236 Network of Schools(强连通 Tarjan+缩点)

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

  3. 【Codeforces】894E.Ralph and Mushrooms Tarjan缩点+DP

    题意 给定$n$个点$m$条边有向图及边权$w$,第$i$次经过一条边边权为$w-1-2.-..-i$,$w\ge 0$给定起点$s$问从起点出发最多能够得到权和,某条边可重复经过 有向图能够重复经过 ...

  4. 【计蒜客 - 程序设计竞赛】商业信息共享(Tarjan缩点)

    题干: 商业信息共享 有 N 个公司,从每个公司都能单向地向另外一个公司分享最新商业信息,因为他们之间有着某种合作,你需要解决两个问题: 现在有一个最新的商业信息,至少需要告诉多少个公司,使得所有的公 ...

  5. 【BZOJ1179】atm,tarjan缩点+最长路径

    Time:2016.05.21 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 题目中是一个带点权的有向图,如果这是一个没有环的图那么问题就很简单,拓扑或者直接求最长(短)路径什么的 ...

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

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

  7. P1262 间谍网络 (tarjan缩点 水过去)

    题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...

  8. tarjan缩点与割点

    Tarjan算法 先是废话时间:说来挺惭愧 , 好几个月以前就学过tarjan算法然而现在才第一次写 模板题:[luogu P3387][模板]缩点 tarjan缩点&dp 为啥要缩点答案显然 ...

  9. Cocos2d之Texture2D类详解之将文件加载成Texture2D对象

    一.声明 笔者以cocos2d框架cocos2d-x-3.3rc0版本的源码做分析.本文为笔者原创,允许转载和分享,只要注明文章出处即可. 二.简介 Texture2D类简介 Texture2D类允许 ...

最新文章

  1. c语言求婚代码大全,这是我见过最浪漫的程序员求婚方式
  2. winform C#的委托事件在winform窗体中传值,也可用于刷新另一窗体(窗体A刷新窗体B)...
  3. mysql日期处理的一些实现
  4. 退出Activity(转)
  5. 淘宝JavaScript 编码风格规范
  6. 飞秋-程序的找工作之苦
  7. python导入mongodb_python实现mongodb的备份与导入
  8. URLEncoder和URLDecoder;cookie中保存特殊字符以及URL中乱码问题解决方案
  9. PLC系统的选型技巧
  10. PXE网络安装Linux操作系统原理与详细过程
  11. 如何修复Win10下的 flashplayer?
  12. 用户登录MySQL服务器的方法
  13. 华为谷歌安装器 Android6.0,gms安装器华为
  14. 删除右键菜单中的 “上传到wps云文档”
  15. linux备份mysql部分表数据,mysqldump导出表的部分数据库
  16. 社会新现象:“蜗婚”离婚不分家
  17. 一文了解DCC-GARCH模型
  18. ICLR2022《COSFORMER : RETHINKING SOFTMAX IN ATTENTION》
  19. 此计算机策略设置不允许安装win,Win10设置了系统策略禁止进行此安装怎么解决?...
  20. 阿里云服务器ECS安装Ubuntu18.04桌面图形环境

热门文章

  1. Windows留后门--教程(二)——Windows计划任务后门
  2. VC6.0MFC下使用GDI++编译链接通不过的解决方案之一(syntax error : identifier 'Count')
  3. 程序员分界线:30岁,30岁转行、35岁转行、35岁被迫裁员
  4. rk3288芯片简介
  5. 2.4 随机变量函数的分布
  6. 电视不正常Android镜像投屏,Mirror for Android TV(安卓电视投屏软件) V2.4 Mac版
  7. 机器学习 (十五) 关联分析之Apriori算法
  8. 大数据的应用场景都有哪些(医疗篇)
  9. Android面试题,framework源码
  10. 动画和漫画里ed、op、OVA、ost、bl、gl是什么意思?