给一个图,问至少加入�多少条有向边能够使图变成强连通的。

原图是有环的,缩点建图,在该DAG图上我们能够发现,要使该图变成强连通图必须连成环

而加入�最少的边连成环,就是把图上入度为0和出度为0的点连上,那么其它的点就都能够互相到达了

所以答案就是max(入度为0的点,出度为0的点)

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define eps 1e-6
#define ll __int64
#define M 20010//图中点数
using namespace std; int sta[M],top; //Tarjan 算法中的栈
bool vis[M]; //检查是否在栈中
int dfn[M]; //深度优先搜索訪问次序
int low[M]; //能追溯到的最早的次序
int ccnt; //有向图强连通分量个数
int id; //索引號
vector<int> e[M]; //邻接表表示
vector<int> part[M]; //获得强连通分量结果
int inpart[M]; //记录每一个点在第几号强连通分量里
int degree[M]; //记录每一个强连通分量的度
vector<int> edge[M];//缩点后建图
int ans,n,m,dp[M],in[M],point[M],out[M]; void tarjan(int x)
{
int i,j;
dfn[x]=low[x]=id++;
vis[x]=1;
sta[++top]=x;
for(i=0;i<e[x].size();i++)
{
j=e[x][i];
if(dfn[j]==-1)
{
tarjan(j);
low[x]=min(low[x],low[j]);
}
else if(vis[j])
low[x]=min(low[x],dfn[j]);
}
if(dfn[x]==low[x])
{
do
{
j=sta[top--];
vis[j]=0;
part[ccnt].push_back(j);
inpart[j]=ccnt;
point[ccnt]++;
}while(j!=x);
ccnt++;
}
} void solve(int n)
{
memset(sta,-1,sizeof sta);
memset(vis,0,sizeof vis);
memset(dfn,-1,sizeof dfn);
memset(low,-1,sizeof low);
memset(point,0,sizeof point); top=ccnt=id=0;
for(int i=1;i<=n;i++)
if(dfn[i]==-1)
tarjan(i);
} int dfs(int x)
{
if(dp[x]) return dp[x];
dp[x]=point[x];
int i;
for(i=0;i<edge[x].size();i++)
{
int tmp=edge[x][i];
dp[x]=max(dp[x],point[x]+dfs(tmp));
}
return dp[x];
} int main()
{
int n,m,i,j,a,b,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
{
part[i].clear();
e[i].clear();
edge[i].clear();
}
while(m--)
{
scanf("%d%d",&a,&b);
e[a].push_back(b);
}
solve(n);
memset(in,0,sizeof in);
memset(out,0,sizeof out);
for(i=1;i<=n;i++)//枚举原图中的边
{
for(j=0;j<e[i].size();j++)
{
a=inpart[i];
b=inpart[e[i][j]];//
if(a!=b)
{
in[b]++;
out[a]++;
edge[a].push_back(b);
}
}
} a=b=0;
for(i=0;i<ccnt;i++)//
{
if(in[i]==0)
a++;
if(out[i]==0)
b++;
}
if(ccnt==1) printf("0\n");
else printf("%d\n",max(a,b));
}
return 0;
}

hdu2767 Proving Equivalences --- 强连通的更多相关文章

  1. HDU2767 Proving Equivalences(加边变为强联通图)

    Proving Equivalences Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. hdu2767 Proving Equivalences Tarjan缩点

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

  3. UVALive Proving Equivalences (强连通分量,常规)

    题意: 给一个有向图,问添加几条边可以使其强连通. 思路: tarjan算法求强连通分量,然后缩点求各个强连通分量的出入度,答案是max(入度为0的缩点个数,出度为0的缩点个数). #include ...

  4. hdu 2767 Proving Equivalences 强连通缩点

    给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...

  5. HDU2767 Proving Equivalences

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

  6. HDU 2767:Proving Equivalences(强连通)

    题意: 一个有向图,问最少加几条边,能让它强连通 方法: 1:tarjan 缩点 2:采用如下构造法: 缩点后的图找到所有头结点和尾结点,那么,可以这么构造:把所有的尾结点连一条边到头结点,就必然可以 ...

  7. hdu - 2667 Proving Equivalences(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=2767 求至少添加多少条边才能变成强连通分量.统计入度为0的点和出度为0的点,取最大值即可. #include & ...

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

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

  9. UvaLive 4287 Proving Equivalences 强连通缩点

    原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

随机推荐

  1. VS2010中属性页中,C/C++ -->预处理器定义

    如上图中,在这里,WIN32._DEBUGE._UNICODE等其实是一些宏定义,在这里写上这些,相当于在本工程所有的文件中都写上了: #define WIN32 #define _DEBUG#def ...

  2. USB设备架构

    USB设备,分为3层:1.底层为传送和接受数据的总线接口:2.中间层处理总线和不同端点的数据传输:3.最高层由串行总线设备提供.主要研究中间层. USB设备状态,主要研究外部可见状态. 1,连接态-- ...

  3. 知问前端--Ajax

    本节课主要是创建一个问题表,将提问数据通过 ajax 方式提交出去.然后对内容显示进行布局,实现内容部分隐藏和完整显示的功能. 一.Ajax 提问创建一个数据表:question,分别建立:id.ti ...

  4. C# winCE5.0开发右键效果解决方案

    用VS2008开发C#语言wince程序,发现程序里右键捕获不到,采集器上点也没反应,上网查好像有个c++版本的,看不懂啊,下面我给出C#实现右键效果的解决方案,请各位多多优化. 首先控件Contex ...

  5. (转)C# DateTime格式化大全

    //c datetime 格式化 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25 Label2 ...

  6. JavaScript和ajax 跨域的案例

    今天突然想看下JavaScript和ajax 跨域问题,然后百度看了一下,写一个demo出来 <!DOCTYPE html> <html xmlns="http://www ...

  7. Android入门1:使用VideoView和MediController播放视频

    最近在搞Android,入门曲线还是挺陡峭的,主要还是自己对Java的理解不够深入.前后学习了几天,把最近学习到的一些知识点总结归纳一下,正所谓温故而知新. 目前想搞一个禁播视频站,主要内容都是一些大 ...

  8. iOS分享 - 对象间的通信之delegate、notificationCenter与block

    在项目开发中,常常会涉及到对象之间的通信,而为了降低对象间的耦合,会采用delegate.notificationCenter.block三种方式来进行实现,对于他们的使用,也许大家都能熟练掌握,但是 ...

  9. dbcp写连接池 Demo

    1.导包 2.准备配置文件   .properties(注:这里的参数名driverClassName.url.username等是不能改变的) 不能任意命名的原因是[你懂得] 3.Demo publ ...

  10. POJ 1759 Garland(二分+数学递归+坑精度)

    POJ 1759 Garland  这个题wa了27次,忘了用一个数来储存f[n-1],每次由于二分都会改变f[n-1]的值,得到的有的值不精确,直接输出f[n-1]肯定有问题. 这个题用c++交可以 ...