题意:

给你一张有向图,问你最少加多少条边这张图强连通

思路:

缩点之后,如果不为1个点,答案为出度为0与入度为0的点的数量的最大值

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
//#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional>
#include<unordered_map> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 5e4+;
const int maxm = 2e6+;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0); vector<int>g[maxn];
int f[maxn];
int color[maxn],dfn[maxn],low[maxn],stack[maxn],vis[maxn],cnt[maxn];
int in[maxn],out[maxn];
int top,n,m,sum,ans;
int deep = ;
void tarjan(int u){
dfn[u]=++deep;
low[u]=deep;
vis[u]=;
stack[++top]=u;
int sz=g[u].size();
for(int i=;i<sz;i++){
int v=g[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else{
if(vis[v]){
low[u]=min(low[u],low[v]);
}
}
}
if(dfn[u]==low[u]){
color[u]=++sum;
vis[u]=;
while(stack[top]!=u){
color[stack[top]]=sum;
vis[stack[top--]]=;
}
top--;
}
return;
}
PI edge[maxn];
vector<int>v[maxn];
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
void dfs(int x, int fa){
if(x!=fa){
int t1 = find(x);
int t2 = find(fa);
f[t1]=t2;
}
if(v[x].size()==&&x!=fa&&vis[x]==){vis[x]=;ans++;}
for(int i = ; i <(int)v[x].size(); i++){
int y = v[x][i];
dfs(y,fa);
}
}
int main() {
while(~scanf("%d %d", &n, &m)){
deep=;
top=ans=sum=;
for(int i = ; i <= n; i++){
f[i]=i;
color[i]=low[i]=dfn[i]=stack[i]=vis[i]=cnt[i]=;
g[i].clear();
v[i].clear();in[i]=out[i]=;
}
for(int i = ; i <= m; i++){
int x,y;
scanf("%d %d", &x, &y);
edge[i] = make_pair(x,y);
g[x].pb(y);
}
for(int i = ; i <= n; i++){
if(!dfn[i])tarjan(i);
}
/*for(int i = 1; i <= n; i++){
printf("--%d %d %d\n",i,color[i],low[i]);
}*/
//suo dian
for(int i = ; i <= n; i++)vis[i]=;
for(int i = ; i <= m; i++){
int x = edge[i].fst;
int y = edge[i].sc;
x = color[x];
y = color[y];
if(x!=y){
v[x].pb(y);
in[y]++;
out[x]++;
}
}
int In=;
int Ou=;
for(int i = ; i <= sum; i++){
if(in[i]==)In++;
if(out[i]==)Ou++;
}
int ans = max(In,Ou);
if(ans==)ans--;
printf("%d\n",ans); }
return ;
}
/*
4 3
1 2
2 3
4 3 4 3
1 2
2 3
3 4 8 6
1 2
1 3
1 5
3 4
3 6
6 7 6 5
1 2
2 3
3 1
3 5
1 4 2 2
1 2
2 1 3 3
1 2
2 3
1 3 7 6
1 2
2 3
1 3
4 5
4 6
4 7 4 5
1 2
1 3
1 4
2 3
3 4 4 5
1 2
1 3
1 4
2 3
4 3 3 1
1 2
*/

HDU3836 Equivalent Sets (Tarjan缩点+贪心)的更多相关文章

  1. hdu 3836 Equivalent Sets trajan缩点

    Equivalent Sets Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 104857/104857 K (Java/Other ...

  2. 20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)

    题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部 ...

  3. 【洛谷P5008 逛庭院】tarjan缩点+贪心

    既然没有题解,那么我就来提供给一份. -- 首先我们看到数据范围.妈耶!数据这么大,一开始还想用个DP来做,但是看着就不行,那么根据这个数据范围,我们大致可以猜到这道题的算法是一个贪心,那么我们怎么贪 ...

  4. hdoj 3836 Equivalent Sets【scc&&缩点】【求最少加多少条边使图强连通】

    Equivalent Sets Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 104857/104857 K (Java/Other ...

  5. [tarjan] hdu 3836 Equivalent Sets

    主题链接: http://acm.hdu.edu.cn/showproblem.php? pid=3836 Equivalent Sets Time Limit: 12000/4000 MS (Jav ...

  6. hdu 3836 Equivalent Sets

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3836 Equivalent Sets Description To prove two sets A ...

  7. hdu 3836 Equivalent Sets(强连通分量--加边)

    Equivalent Sets Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 104857/104857 K (Java/Other ...

  8. hdu——3836 Equivalent Sets

    Equivalent Sets Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 104857/104857 K (Java/Other ...

  9. 【HDOJ2767】【Tarjan缩点】

    http://acm.hdu.edu.cn/showproblem.php?pid=2767 Proving Equivalences Time Limit: 4000/2000 MS (Java/O ...

随机推荐

  1. 移动web 1像素边框

    实现方法 border-image 图片 实现 这篇文章是腾讯github上的解决方案border-image来实现的 链接走起 <使用border-image实现类似iOS7的1px底边> ...

  2. 微信小程序订阅消息,我踩过的坑都在这里了!

    旧的模板消息将在 2020 年 1 月 10 号全面下架,也就是今天,不过貌似现在还可以用!!!我已经改好了,只不过还没有上线,准备坚持到最后一天! 0.订阅消息 简单介绍一下订阅消息的特点: 用户授 ...

  3. PHP的一些安全设置

    小伙伴们新年好啊,又有半个月没有更新博客了.更新也比较随性,想起什么就写点什么,方便和大家工作同学习总结. 最近和同事说起了PHP安全相关的问题,记录下一些心得体会. 由于脚本语言和早期版本设计的诸多 ...

  4. 【转】DB2数据库编目的概念以及对其的正确解析

    此文章主要向大家描述的是DB2数据库编目的概念以及对DB2数据库编目的概念的正确理解,在DB2中编目(catalog)这个单词看似很难理解,我自己当初在学习DB2数据库的时候也常常被这个编目搞的很不明 ...

  5. luogu 题解 P2380 【狗哥采矿】

    拿到dp题我们就要想如何推方程 “最北边有bloggium的收集站,最西边有 yeyenum 的收集站.现在要你在这些格子上面安装向北或者向西的传送带(每个格子只能装一种).” 这说明了什么,对于某一 ...

  6. kaggle竞赛分享:NFL大数据碗(上篇)

    kaggle竞赛分享:NFL大数据碗 - 上 竞赛简介 一年一度的NFL大数据碗,今年的预测目标是通过两队球员的静态数据,预测该次进攻推进的码数,并转换为该概率分布: 竞赛链接 https://www ...

  7. Nginx代理服务——常用的配置语法

    可以到官方查看所有代理的配置语法http://nginx.org/en/docs/http/ngx_http_proxy_module.html 缓存区 Syntax:proxy_buffering ...

  8. .net core ef动态orderby

    前言 最近在给大家写一套开源的.net core权限管理框架.现在已经写到前台UI + 后台动态查询的部分. 发现需要动态orderby但是网上没有现成的例子 二话不说上代码 建议namespace ...

  9. Python Selenium定位元素常用解决办法

       在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException), ...

  10. 改进Zhang Suen细化算法的C#实现

    本文主要实现了改进Zhang Suen细化算法的C#实现,相关论文 :“牟少敏,杜海洋,苏平,查绪恒,陈光艺.一种改进的快速并行细化算法[J].微电子学与计算机,2013,(第1期)” .这篇论文中关 ...