题意:添加多少边才能使这个无向图为双连通分量。
注意:双连通分量适用于无向图;而强连通分量适用于有向图。但是这两个概念都是一样的。

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
const int maxx=20005;
const int inf=0x3f3f3f3f;
int low[maxx];
int dfn[maxx];
int vis[maxx];
int flag[maxx];
int blong[maxx];//记录这个节点属于哪个强连通分量
int indegree[maxx];//记录入度
int outdegree[maxx];//记录出度
int index;
int tcost[maxx];
int root;
int num[maxx];
int ans;//记录强连通分量的个数
int n,m;
int head[maxx];
stack<int>s;
vector<int>G[maxx];
void dfs(int u,int fa){index++;low[u]=dfn[u]=index;s.push(u);vis[u]=1;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v==fa)continue;if(dfn[v]==0){dfs(v,u);low[u]=min(low[u],low[v]);}else if(vis[v]==1){low[u]=min(low[u],dfn[v]);}}if(dfn[u]==low[u]){ans++;int v;do{v=s.top();s.pop();blong[v]=ans;vis[v]=0;}while(u!=v);}
}
void init(){ans=0;memset(head,-1,sizeof(head));memset(flag,0,sizeof(flag));memset(num,0,sizeof(num));memset(vis,0,sizeof(vis));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(blong,0,sizeof(blong));memset(indegree,0,sizeof(indegree));memset(outdegree,0,sizeof(outdegree));while(!s.empty())s.pop();for(int i=0;i<=n;i++){G[i].clear();}
}
int main(){int count=1;while(scanf("%d %d",&n,&m)!=EOF){init();index=1;root=1;for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);G[a].push_back(b);G[b].push_back(a);}ans=0;for(int i=1;i<=n;i++){if(dfn[i]==0){dfs(i,i);}}for(int i=1;i<=n;i++){for(int j=0;j<G[i].size();j++){int v=G[i][j];if(blong[i]!=blong[v]){outdegree[blong[i]]++;indegree[blong[v]]++;}}}int ans1=0;for(int i=1;i<=ans;i++){if(outdegree[i]==1){ans1++;}else if(outdegree[i]==0){ans1+=2;}}if(ans==1){ans1-=2;}cout<<(ans1+1)/2<<endl;}return 0;
}

poj3352(强连通分量)相关推荐

  1. 极小连通子图和极大连通子图_强连通分量与拓扑排序

    前言 由于GacUI里面开始多处用上拓扑排序,我决定把之前瞎JB搞出来的算法换掉,换成个正式的.之前我自己弄了个写起来很简单的算法,然后每一处需要用到的地方我就重新做一遍.当然这样肯定也是不行的,我觉 ...

  2. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  3. HDU4635(强连通分量+Kosaraju算法)

    题意:给出一个有向图,最多添加多少条边使这个图依然不是强连通图:当这个图是强连通图时,输出-1: 求解思路:强连通分量求解: 强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. ...

  4. poj2553(强连通分量)

    题意:给出有向图,图的底部是所有汇节点的子集,即,底部(G)={v∈V\x-∀w∈V:(v→w)⇒(w→v)},w在--里面G可以从v, v也可从w.让我们求有多少个点是绘点的问题. 思路:先求解出强 ...

  5. poj2186(强连通分量)

    思路:找出出度为0 的顶点,如果出度为0的顶点大于1,则解为零,否则解就是出度为零的顶点的连通分支数. 刚开始是没有理解这道题的,也是看了大神之后才理解的. 方法一: #include<iost ...

  6. poj1236(强连通分量)

    题意: (1).至少需要向多少个学校发放软件,要使这个网络中的所有学校都能得到软件 (2).至少需要添加多少条边,才能使这个网络成为一个强连通分量图. 思路:首先求解强连通分量,如果不是同一个强连通分 ...

  7. HDU5934(强连通分量)

    题意:主要在诈弹爆炸的范围内如果存在其他的诈弹,那么在周围的诈弹也将会被引爆,这样思路就可以想到强连通分量了: 思路:先求解强连通分量,在找到强连通分量时,也求解出这个强连通分量的最小费用mincos ...

  8. HDU2767(强连通分量+Kosaraju算法)

    题意:需要加多少边才能把一个图变成强连通分量 强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. 强连通分量:在非强连通图的有向图中,选取部分点为强连通图,该强连通子图称为强连 ...

  9. HDU1827(强连通分量)

    强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. 强连通分量:在非强连通图的有向图中,选取部分点为强连通图,该强连通子图称为强连通分量. 注意:这道题只给出的是Wiskey和 ...

最新文章

  1. python提取excel中的某几列数据-python-将excel中的某些列读取到数据框
  2. macOS 开启 VNC 远程桌面和 SSH 服务
  3. 15款最好的网站音乐播放器
  4. php-fpm的pool、php-fpm慢执行日志、open_basedir、php-fpm进程管理
  5. 计算机管理器win,进入windows启动管理器,win启动管理器
  6. 为您的软件系统设计选择最佳的工具
  7. JAX-RS 2.0的新功能– @BeanParam批注
  8. java如何关闭一个线程_如何关闭一个java线程池
  9. 程序员在周末学习的8个实用技术
  10. css 清空ios端_H5移动端开发常见的问题处理
  11. 上传图片并显示缩略图的最简单方法(c#)
  12. 成都python数据分析师培训_python数据分析师
  13. python import random_python import random 后一直无法使用解决方法
  14. SHFileOperation DeleteFolder
  15. 软件架构风格 - 虚拟机风格
  16. 【Windows】将bat文件注册为windows服务
  17. 记录一下第一个个人小程序
  18. 【2020-10-28】DS12C887+驱动
  19. ExcelToMySQL-批量导入Excel文件到MySQL数据库的自动化工具
  20. 计算机音乐b型谱简单,《神奇秘谱》琴曲的调弦法

热门文章

  1. 管理员信息管理之获取管理员用户列表数据
  2. 复习计算机网络day2
  3. 这篇文章,或许可以改善你的不快乐。
  4. 计算机视觉方向简介 | 手机产品条码检测方案
  5. 干货|TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)
  6. 最小二乘法的本质是什么?
  7. 11: facebook原生登录
  8. 借助阿里云数加,小小的美甲行业被美甲帮玩出了天价。
  9. 玩转 iOS 开发:《iOS 设计模式 — 工厂模式》
  10. 网络故障排除连载之一:常用排除方法综述