HD2767Proving Equivalences(有向图强连通分量+缩点)
题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的
分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG。接下来,设有a个节点(每个节点对应一个强连通分量)的入度为0,b个节点的出度为0,然后取ab最大的就行了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
const int Max = + ;
vector<int> g[Max];
int low[Max], dfn[Max];
stack<int> st;
int scc_cnt, dfs_clock, sccno[Max]; //scc_cnt强连通分量个数,sccno[x]表示x属于第几个强连通分量
int in0[Max], out0[Max];
int n, m;
int Min(int x, int y)
{
return x > y ? y : x;
}
void init()
{
for(int i = ; i <= n; i++)
g[i].clear();
memset(low, , sizeof(low));
memset(dfn, , sizeof(dfn));
memset(sccno, , sizeof(sccno));
while(!st.empty())
st.pop();
dfs_clock = scc_cnt = ;
}
void input()
{
int u, v;
scanf("%d%d", &n, &m);
for(int i = ; i < m; i++)
{
scanf("%d%d", &u, &v);
g[u].push_back(v);
}
}
void dfs(int u)
{
low[u] = dfn[u] = ++dfs_clock;
st.push(u);
int len = g[u].size();
for(int i = ; i < len; i++)
{
int v = g[u][i];
if(!dfn[v])
{
dfs(v);
low[u] = Min(low[u], low[v]);
}
else if(!sccno[v])
{
low[u] = Min(low[u], dfn[v]);
}
}
//构成一个环就成了强连通分量了
if(low[u] == dfn[u])
{
scc_cnt++;
while(!st.empty())
{
int x = st.top();
st.pop();
sccno[x] = scc_cnt;
if(x == u)
break;
}
}
}
void solve()
{
for(int i = ; i <= n; i++)
{
if(!dfn[i])
dfs(i);
}
memset(in0, , sizeof(in0));
memset(out0, , sizeof(out0));
for(int i = ; i <= n; i++)
{
int len = g[i].size();
for(int j = ; j < len; j++)
{
int v = g[i][j];
if(sccno[i] != sccno[v])
{
out0[sccno[i]]++;
in0[sccno[v]]++;
}
}
}
int a = , b = ;
for(int i = ; i <= scc_cnt; i++)
{
if(!in0[i])
a++;
if(!out0[i])
b++;
}
int ans = max(a, b);;
if(scc_cnt == ) //如果本身就是连通的输出0
ans = ;
printf("%d\n", ans);
}
int main(int argc, char** argv)
{
int t;
scanf("%d", &t);
while(t--)
{
init();
input();
solve();
}
return ;
}
HD2767Proving Equivalences(有向图强连通分量+缩点)的更多相关文章
- UVALIVE 4287 Proving Equivalences (强连通分量+缩点)
题意:给定一个图,问至少加入多少条边能够使这个图强连通. 思路:首先求出这个图的强连通分量.然后把每个强连通分量缩成一个点.那么这个图变成了一个DAG,求出全部点的入度和出度,由于强连通图中每个节点的 ...
- Tarjan算法求有向图强连通分量并缩点
// Tarjan算法求有向图强连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> #inc ...
- POJ1236Network of Schools[强连通分量|缩点]
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16571 Accepted: 65 ...
- POJ1236Network of Schools(强连通分量 + 缩点)
题目链接Network of Schools 参考斌神博客 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后 ...
- UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)
题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...
- ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)
题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...
- POJ2553 The Bottom of a Graph(强连通分量+缩点)
题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v). 把图的强连通分量缩点,那么答案显然就是所有出度为0的点. 用Tarjan找强连通分量: #include<cstdio&g ...
- tarjan求强连通分量+缩点+割点以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
随机推荐
- web文档在线阅览
之前遇到很多各种文档在线阅览的需求,也有不少朋友经常问我这种需求的实现方案,大致试了一下网上的一些比较主流的推荐方案,但都不尽如人意,这里有一个比较全面的总结,需要的朋友可以根据自己的需求到这里查看, ...
- (二十三)原型模式详解(clone方法源码的简单剖析)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...
- android服务之MP3播放(2)
该播放器将会直接从网络上获取资源进行播放,并提供进度条显示的功能 布局文件 布局文件中使用Seekbar组件来显示进度条 <?xml version="1.0" encodi ...
- android之广播(二)
广播接受者不仅可以通过清单文件来向系统注册,也可以通过代码来注册.并且有的广播必须通过代码来注册广播接受者. 锁屏和解锁广播 电量改变广播 打开屏幕和关闭屏幕 这里将广播接收者写在服务里面 <? ...
- killall 根据名称终止进程
根据名称终止进程 killall [option] name-list killall 将信号发送到一个或多个进程用来终止它.除超级用户外,只有进程的所有者才可以对进程执行killall,超级用户可以 ...
- RabbitMQ官方中文入门教程(PHP版) 第二部分:工作队列(Work queues)
工作队列 在第一篇教程中,我们已经写了一个从已知队列中发送和获取消息的程序.在这篇教程中,我们将创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Works ). 工作队列 ...
- oracle去重等基础问题
--去重查询方法一:根据id select * from sxe where id in(select min(id) from sxe group by username) order by id ...
- exce生成随机数
有时候数据库没有数据,造数据专用. 来源于:http://jingyan.baidu.com/article/93f9803feba1f5e0e46f55f2.html 首先介绍一下如何用RAND() ...
- Android快速开发框架LoonAndroid (转)
1.源码简介: 主要有以下模块: (1) 自动注入框架(只需要继承框架内的application既可) (2) 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性) (3) 网络请求模块(继承 ...
- iOS开发--录音简单实现