题意:

  给一个有向图,问添加几条边可以使其强连通。

思路:

  tarjan算法求强连通分量,然后缩点求各个强连通分量的出入度,答案是max(入度为0的缩点个数,出度为0的缩点个数)。

 #include <bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
using namespace std;
const int N=+;
const int INF=0x7f7f7f7f; vector<int> vect[N];
stack<int> stac;
bool chu[N], ru[N];
int scc_no[N], lowlink[N], dfn[N];
int dfn_clock, scc_cnt;
int n, m; void DFS(int x)
{
stac.push(x);
dfn[x]=lowlink[x]=++dfn_clock;
for(int i=; i<vect[x].size(); i++)
{
int t=vect[x][i];
if(!dfn[t])
{
DFS(t);
lowlink[x]=min(lowlink[x],lowlink[t]);
}
else if(!scc_no[t]) //如果t不属于任何一个强连通分量
lowlink[x]=min(lowlink[x],dfn[t]);
}
if(lowlink[x]==dfn[x])
{
scc_cnt++;
while(true)
{
int t=stac.top();
stac.pop();
scc_no[t]=scc_cnt;
if(t==x) break;
}
}
} int cal()
{
memset(dfn,,sizeof(dfn));
memset(lowlink,,sizeof(lowlink));
memset(scc_no,,sizeof(scc_no)); dfn_clock=scc_cnt=;
for(int i=; i<=n; i++) if(!dfn[i]) DFS(i); //深搜
if(scc_cnt==) return -; memset(chu,,sizeof(chu));
memset(ru,,sizeof(ru));
for(int i=; i<=n; i++)
for(int j=; j<vect[i].size(); j++) //统计出入度
if(scc_no[i]!=scc_no[vect[i][j]]) chu[scc_no[i]]=ru[scc_no[vect[i][j]]]=true;//这里麻烦了点,小心点出错 int c=, r=;
for(int i=; i<=scc_cnt; i++)
{
if(!chu[i]) c++;
if(!ru[i]) r++;
}
return max(c,r)-;
} int main()
{
freopen("input.txt", "r", stdin);
int a, b, t;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++) vect[i].clear();
for(int i=; i<m; i++)
{
scanf("%d%d", &a, &b);
vect[a].push_back(b);
}
printf("%d\n",cal());
}
return ;
}

AC代码

最新文章

  1. 迭代器和for-of
  2. 可选的Web Components类库
  3. PHP学习笔记--文件目录操作(文件上传实例)
  4. yii2源码学习笔记(十二)
  5. js实现无限级树形导航列表
  6. 第三篇——第二部分——第六文 监控SQL Server镜像
  7. 数据库连接池druid
  8. beamer中插入c代码,python代码的经验
  9. Redis 部署主从哨兵 C#使用,实现自动获取redis缓存 实例1
  10. Mybatis JPA 插件简介(v2.1.0)
  11. 在Linux(ubuntu 14.04)上部署WeX5跨平台App(HTML5)
  12. Windows Server 2008 R2 服务器系统安装及配置全过程图文详解
  13. vue 跨域问题
  14. Nmap扫描常用参数
  15. scrapy基础 之 xpath网页结构
  16. python-浅拷贝和深拷贝
  17. BGP - 4,BGP的三张表
  18. django之创建第2个项目
  19. pandas 之 set_index
  20. c# 遍历一个对象里面的全部属性

热门文章

  1. 浅谈String类型
  2. POJ 2516 最小费用最大流
  3. linux安装软件命令
  4. poj 2226 Muddy Fields (转化成二分图的最小覆盖)
  5. JavaScript与DOM的关系
  6. 分析Hibernate的事务处理机制
  7. 原生js获取window高和宽
  8. JavaScript中创建字典对象(dictionary)实例
  9. Windows下的Memcache安装与测试教程
  10. POJ 1850 Code(组合数)