至少加几条边成为双连通分量

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=10000;
struct
{int to,next;
}e[maxn];
int head[maxn],lon;
int dfn[maxn],instack[maxn],low[maxn],stack[maxn],s[maxn];
int in[maxn];
int count,top,con;
int n,m;
void edgemake(int from,int to,int head[])
{e[++lon].to=to;e[lon].next=head[from];head[from]=lon;
}
void edgeini()
{memset(head,-1,sizeof(head));lon=-1;
}void tarjan(int t,int from)
{dfn[t]=low[t]=++count;instack[t]=1;stack[++top]=t;for(int k=head[t];k!=-1;k=e[k].next){if(k==(from^1)) continue;int u=e[k].to;if(dfn[u]==-1){tarjan(u,k);low[t]=min(low[t],low[u]);}else if(instack[u]){low[t]=min(low[t],dfn[u]);}}if(dfn[t]==low[t]){++con;while(1){int u=stack[top--];instack[u]=0;s[u]=con;if(u==t) break;}}
}void tarjan()//tarjan的初始化
{memset(dfn,-1,sizeof(dfn));memset(instack,0,sizeof(instack));count=top=con=0;for(int i=1;i<=n;i++)if(dfn[i]==-1)tarjan(i,-1);
}int main()
{while(scanf("%d %d",&n,&m)!=EOF){edgeini();for(int i=1,from,to;i<=m;i++){scanf("%d %d",&from,&to);edgemake(from,to,head);edgemake(to,from,head);}tarjan();memset(in,0,sizeof(in));for(int i=1;i<=n;i++)for(int k=head[i];k!=-1;k=e[k].next)if(s[i]!=s[e[k].to]){in[s[i]]++;}int ans=0;for(int i=1;i<=con;i++)if(in[i]==1)ans++;else if(in[i]==0)ans+=2;if(con==1) ans-=2;printf("%d\n",(ans+1)/2);}return 0;
}

转载于:https://www.cnblogs.com/pangblog/p/3268571.html

poj 3352 双连通分量相关推荐

  1. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)

    http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何求 ...

  2. 【POJ - 3352】Road Construction(Tarjan,边双连通分量)

    题干: It's almost summer time, and that means that it's almost summer construction time! This year, th ...

  3. poj 3352 Road Construction(边-双连通分量)

    题意:给定一个连通的无向图G,至少要添加几条边,才能使其变为双连通图. 解题思路: 显然,当图G存在桥(割边)的时候,它必定不是双连通的.桥的两个端点必定分别属于图G的两个[边双连通分量](注意不是点 ...

  4. POJ 3352 无向图边双连通分量,缩点,无重边

    为什么写这道题还是因为昨天多校的第二题,是道图论,HDU 4612.当时拿到题目的时候就知道是道模版题,但是苦于图论太弱.模版都太水,居然找不到.虽然比赛的时候最后水过了,但是那个模版看的还是一知半解 ...

  5. 【POJ - 3177】Redundant Paths(边双连通分量,去重边)

    题干: In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1.. ...

  6. POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)

    POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...

  7. poj 2942 Knights of the Round Table(双连通分量+tarjan+二分图判定)

    http://poj.org/problem?id=2942 题意: 有N个骑士,给出某些骑士之间的仇恨关系,骑士们开会时会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件: 1:任意相互憎恨的 ...

  8. POJ - 2942 Knights of the Round Table (双连通分量)

    题目链接 题意 有N个骑士,每个骑士有自己不喜欢的人,你需要选择奇数个骑士开一个圆桌会议,每个骑士不能和自己不喜欢的人挨着坐. 问需要删除那些人,这些人不能组成圆桌会议 思路 按照补图建边求双连通分量 ...

  9. POJ 3694 Network ★(边双连通分量+并查集缩点+LCA)

    [题意]一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(每次回答是在上一次连边的基础之上) [分析]好题,做完后涨了很多姿势~ 普通做法当然就是每加 ...

最新文章

  1. matlab_EDA 数据球面化
  2. wxWidgets:键盘 wxWidgets 示例
  3. 字节跳动---万万没想到之聪明的编辑
  4. codeblock在linux中安装 出错
  5. Python和Java结合的项目实战_[项目实战] Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 [...
  6. 来吧,给自己提个醒,哭着复习一下当初没好好学习的内容。
  7. 【acl-访问控制列表】
  8. Android TV开发总结(五)TV上屏幕适配总结
  9. HttpClient下载图片实例
  10. 运放系列:电压跟随器
  11. 数值核反应堆大数据及其应用
  12. 企业服务总线 ESB 介绍和用例
  13. 华为策略路由,实现双线选路上网
  14. 傅里叶变换之掐死教程(完整版)
  15. 揭秘手机变手雷的四大病毒
  16. pytorch 预测手写体数字_深度学习之PyTorch实战(3)——实战手写数字识别
  17. FreeTextBox使用方法
  18. .net.3.5sp1_隐藏的宝石-与旧的3.5 SP1帖子不同
  19. 自然数学-反函数的求导法则
  20. 工具使用——使用华为手机作为电脑的拓展屏

热门文章

  1. 安装 m2eclipse 插件
  2. PostgreSQL 11 100亿 tpcb 性能测试 on ECS
  3. 离用户近一点,再近一点
  4. in 和 exist 区别
  5. poj 3565 uva 1411 Ants KM算法求最小权
  6. spring mybatis 集成
  7. WinSocket简单编程实验
  8. 《PHP和MySQL Web开发》学习之二--数据的存储与检索
  9. python字典排序取最值总结
  10. 聚集索引与非聚集索引的总结