hdu 3836 强连通+缩点:加边构强连通
#include<stdio.h>//求出其所有的强连通分量缩点,选出出度和入度最大的那个就是要求的边
#include<string.h>
#include<stdlib.h>
#define N 51000
struct node {
int v,next;
}bian[N];
int head[N],yong,n,indegree[N],outdegree[N],visit[N],suo[N],dfn[N],f,low[N],index,stac[N],top;
void addedge(int u,int v) {
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void init() {
memset(head,-1,sizeof(head));
yong=0;index=0,top=0;f=0;
memset(outdegree,0,sizeof(outdegree));
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(indegree,0,sizeof(indegree));
memset(visit,0,sizeof(visit));
memset(stac,0,sizeof(stac));
}
int Min(int a,int b) {
return a>b?b:a;
}
int MAX(int a,int b) {
return a>b?a:b;
}
void tarjan(int u) {
int v,i;
dfn[u]=low[u]=++index;
visit[u]=1;
stac[++top]=u;
for(i=head[u];i!=-1;i=bian[i].next) {
v=bian[i].v;
if(!dfn[v]) {
tarjan(v);
low[u]=Min(low[u],low[v]);
}
else
if(visit[v]==1)
low[u]=Min(low[u],dfn[v]);
}
if(dfn[u]==low[u]) {
f++;
int v;
do{
v=stac[top--];
visit[v]=2;
suo[v]=f;
}while(v!=u);
}
}
int main() {
int m,i,j,fin,fou,v;
while(scanf("%d%d",&n,&m)!=EOF) {
if(m==0) {
printf("%d\n",n);
continue;
}
init();
while(m--) {
scanf("%d%d",&i,&j);
addedge(i,j);
}
for(i=1;i<=n;i++)
if(visit[i]!=2)
tarjan(i);
if(f==1) {//判断是否已经是一个联通图
printf("0\n");
continue;
}
// printf("1\n");
for(i=1;i<=n;i++)
for(j=head[i];j!=-1;j=bian[j].next) {
v=bian[j].v;
// printf("%d %d\n",suo[i],suo[v]);
if(suo[i]!=suo[v]) {
indegree[suo[v]]++;
outdegree[suo[i]]++; }
}
fin=0;fou=0;
for(i=1;i<=f;i++) {
if(indegree[i]==0)
fin++;
if(outdegree[i]==0)
fou++;
}
printf("%d\n",MAX(fin,fou));
}
return 0;
}
hdu 3836 强连通+缩点:加边构强连通的更多相关文章
- hdu - 3836 Equivalent Sets(强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=3836 判断至少需要加几条边才能使图变成强连通 把图缩点之后统计入度为0的点和出度为0的点,然后两者中的最大值就是 ...
- hdu 4635 Strongly connected 强连通缩点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...
- hdu 2767 Proving Equivalences 强连通缩点
给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...
- hdu 3836 Equivalent Sets(tarjan+缩点)
Problem Description To prove two sets A and B are equivalent, we can first prove A is a subset of B, ...
- HDU - 3836 Equivalent Sets (强连通分量+DAG)
题目大意:给出N个点,M条边.要求你加入最少的边,使得这个图变成强连通分量 解题思路:先找出全部的强连通分量和桥,将强连通分量缩点.桥作为连线,就形成了DAG了 这题被坑了.用了G++交的,结果一直R ...
- 【HDU 5934】Bomb(强连通缩点)
Problem Description There are N bombs needing exploding. Each bomb has three attributes: exploding r ...
- poj2553 强连通缩点
The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 10114 Accepted: ...
- BZOJ 1051: [HAOI2006]受欢迎的牛 强连通缩点
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1051 题解: 强连通缩点得到DAG图,将图转置一下,对入度为零的点跑dfs看看能不能访问 ...
- UVA - 11324 The Largest Clique 强连通缩点+记忆化dp
题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...
随机推荐
- int*与(int*)的差别
晚上被问到一个C++的问题: int **pa=new int* [5]; int *pb=new (int*)[5]; 上面两行代码的差别是什么? 分析与实验结果例如以下: (1)第一行代码能够在V ...
- 用SecureCRT在linux系统下载文件
使用sz命令 说明如下: sz --helpsz version 0.12.20Usage: sz [options] file ... or: sz [options] -{c|i} COMMA ...
- 0x66 Tarjan算法与无向图联通性
bzoj1123: [POI2008]BLO poj3694 先e-DCC缩点,此时图就变成了树,树上每一条边都是桥.对于添加边的操作,相当于和树上一条路径构环,导致该路径上所有边都不成为桥.那么找这 ...
- Cache操作类
封装类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys ...
- 找新朋友(hdoj--1286--欧拉函数)
欢迎参加--每周六晚的BestCoder(有米!) 找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- Nginx调优实战
Nginx配置文件性能微调 全局的配置 user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofi ...
- 关于Mybatis的几个问题
今天在用mybatis开发的时候遇到两个问题,下面一一列出并给出解决方案. 问题一 最开始我设置的实体类中有个字段如isParent为boolean类型,set和get方法是eclispe自动生成的. ...
- 45.Qt openGL实现三维绘图
main.cpp #include <QApplication> #include <iostream> #include "tetraheadron.h" ...
- IEnumerable ICollection IList
- 适配器模式(adapter)C++实现
意图:将一个类的接口转换成客户希望的另一个接口. 适用性:1.你想使用一个已存在的类,而它的接口不符合你的需求. 2.你想创建一个可以复用的类,该类可以与其它不相关的类或不可预见的类协同工作. 类适配 ...