HDU 2767-Proving Equivalences(强联通+缩点)
题目地址: pid=2767">HDU 2767
题意:给一张有向图。求最少加几条边使这个图强连通。
思路:先求这张图的强连通分量。假设为1。则输出0(证明该图不须要加边已经是强连通的了)。否则缩点。
遍历原图的全部边。假设2个点在不同的强连通分量里面,建边,构成一张新图。统计新图中点的入度和出度,取入度等于0和出度等于0的最大值(由于求强连通缩点后。整张图就变成了一个无回路的有向图。要使之强连通。仅仅须要将入度=0和出度=0的点加边就可以,要保证加边后没有入度和出度为0的点,所以取两者最大值)
PS:补充一下缩点的含义:我们求强连通分量时,给每一个顶点做一个标记,标记该顶点属于哪个强联通分量,然后属于同一个强连通分量的点就能够看作同一个点了。
这就是所谓的“缩点”
*#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
const int maxn=21010;
int head[maxn],dfn[maxn],low[maxn],belong[maxn],stak[maxn],instack[maxn];
int in[maxn],out[maxn];
int incnt,outcnt;
int cnt,index,top,ans;
struct node {
int u, v, next;
} edge[maxn*3];
void add(int u, int v) {
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void Init() {
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(instack,0,sizeof(instack));
cnt=index=top=ans=0;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
incnt=outcnt=0;
}
void tarjan(int u) {
dfn[u]=low[u]=++index;
stak[++top]=u;
instack[u]=1;
for(int i=head[u]; i!=-1; i=edge[i].next) {
int v=edge[i].v;
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else if(instack[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]) {
ans++;
while(1) {
int v=stak[top--];
instack[v]=0;
belong[v]=ans;
if(u==v) break;
}
}
}
int main() {
int T, n, m,i, j;
int u,v;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
Init();
while(m--) {
scanf("%d%d",&u,&v);
add(u,v);
}
for(i=1; i<=n; i++) {
if(!dfn[i])
tarjan(i);
}
if(ans==1) {
printf("0\n");
continue ;
}
for(i=1; i<=n; i++) {
for(j=head[i]; j!=-1; j=edge[j].next) {
int v=edge[j].v;
if(belong[v]!=belong[i]) {
in[belong[v]]++;
out[belong[i]]++;
}
}
}
for(i=1; i<=ans; i++) {
if(!in[i])
incnt++;
if(!out[i])
outcnt++;
}
printf("%d\n",max(incnt,outcnt));
}
return 0;
}*
HDU 2767-Proving Equivalences(强联通+缩点)的更多相关文章
- HDU 2767 Proving Equivalences (强联通)
pid=2767">http://acm.hdu.edu.cn/showproblem.php?pid=2767 Proving Equivalences Time Limit: 40 ...
- HDU 2767 Proving Equivalences(强连通 Tarjan+缩点)
Consider the following exercise, found in a generic linear algebra textbook. Let A be an n × n matri ...
- hdu 2767 Proving Equivalences(tarjan缩点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2767 题意:问最少加多少边可以让所有点都相互连通. 题解:如果强连通分量就1个直接输出0,否者输出入度 ...
- hdu 2767 Proving Equivalences
Proving Equivalences 题意:输入一个有向图(强连通图就是定义在有向图上的),有n(1 ≤ n ≤ 20000)个节点和m(0 ≤ m ≤ 50000)条有向边:问添加几条边可使图变 ...
- HDU 2767 Proving Equivalences(至少增加多少条边使得有向图变成强连通图)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 2767 Proving Equivalences (Tarjan)
Proving Equivalences Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other ...
- HDU 2767.Proving Equivalences-强连通图(有向图)+缩点
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu 2767 Proving Equivalences 强连通缩点
给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...
- HDU 2767:Proving Equivalences(强连通)
题意: 一个有向图,问最少加几条边,能让它强连通 方法: 1:tarjan 缩点 2:采用如下构造法: 缩点后的图找到所有头结点和尾结点,那么,可以这么构造:把所有的尾结点连一条边到头结点,就必然可以 ...
随机推荐
- Elasticsearch如何做到亿级数据查询毫秒级返回?
阅读本文大概需要 6 分钟. 如果面试的时候碰到这样一个面试题:ES 在数据量很大的情况下(数十亿级别)如何提高查询效率? 这个问题说白了,就是看你有没有实际用过 ES,因为啥?其实 ES 性能并没有 ...
- 数塔问题mod 100(orz)
看一下题目 和普通的数字三角形看似没啥区别(区别很大) 然后去想:DP方程 DP[i][j]=Max(DP[i-][j],DP[i-][j-])+a[i][j] ans=Max(DP[n][..n]) ...
- day01_12/11/2016_Spring入门PPT
s1 s2 s3 s4 s5 s6 s7 s8 IOC1 IOC2 入门编写1 入门编写2 入门编写3 入门编写4---心得
- 使用A*寻路小记
前几天做另一个DEMO 要用实现自动寻路功能,看到普遍都是A* 学习了下 我的主循环代码: isFindEndPoint = false; //主循环 do { CreateOutSkirtsNode ...
- Java中的异常注意点
在java中 使用throw关键字抛出异常 使用throws关键字声明异常 public static void main(String[] args) throws Exception{ ...
- Spring的核心机制依赖注入
原文地址:http://developer.51cto.com/art/200610/33311.htm 本文主要讲解依赖注入(设值注入.构造注入),作用是可以使Spring将各层的对象以松耦合的方式 ...
- C#——反射动态创建类的实例
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法. ...
- java攻城狮之路--复习xml&dom_pull编程续
本章节我们要学习XML三种解析方式: 1.JAXP DOM 解析2.JAXP SAX 解析3.XML PULL 进行 STAX 解析 XML 技术主要企业应用1.存储和传输数据 2.作为框架的配置文件 ...
- [Windows Server 2003] 安装PHP+MySQL方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:PHP+MyS ...
- day10-函数基础知识
函数 什么是函数 把工具事先准备好,然后下次使用的时候,直接使用就行了.我们的函数就是工具 为何用函数 1.遇到重复的功能只能重复编写实现代码,代码冗余 2.功能需要扩展时,需要找出所有实现该功能的地 ...