题目大意:将n个点,m条边的无向图变成强连通图,最少需要加几条有向边。

题目分析:所谓强连通,就是无向图中任意两点可互达。找出所有的边连通分量,每一个边连通分量都是强连通的,那么缩点得到bcc图,只需考虑在bcc图上加有向边。如果,bcc图是由v个孤立的点,0条边构成的,则最少需要添加v条(将v个点首尾顺次连起来构成一条圈)有向边。如果由v个点,k条边构成,则对于每一个顶点,如果度数大于2,就不用给它加任何边,因为它一定能会在圈中;如果度数为1,则为这个点添只加一条边即可;如果度数为0,也就是孤立点,要想连在圈中,必须添加两条边。最后,考虑到重复,把累加和除以2后向上取整便是答案。

找边双连通分量套模板。。。标记每一个桥,再深搜一次,过程中不经过桥。

代码如下:

# include<iostream>
# include<cstdio>
# include<vector>
# include<stack>
# include<cstring>
# include<algorithm>
using namespace std;
# define REP(i,s,n) for(int i=s;i<n;++i)
# define CL(a,b) memset(a,b,sizeof(a)) struct Edge
{
int to,flag;
Edge(int v,int f):to(v),flag(f){}
};
const int N=1005;
int n,m,bcc_cnt,dfs_clock,low[N],pre[N],bccno[N],du[N];
vector<int>G[N];
vector<Edge>e; void dfs(int u,int fa)
{
low[u]=pre[u]=++dfs_clock;
REP(i,0,G[u].size()){
int v=e[G[u][i]].to;
if(!pre[v]){
dfs(v,u);
low[u]=min(low[v],low[u]);
if(low[v]>low[u])
e[G[u][i]].flag=e[G[u][i]^1].flag=1;
}else if(pre[v]<pre[u]&&v!=fa)
low[u]=min(low[u],pre[v]);
}
} void dfs1(int u)
{
bccno[u]=bcc_cnt;
REP(i,0,G[u].size()){
int v=e[G[u][i]].to;
if(!bccno[v]&&!e[G[u][i]].flag) dfs1(v);
}
} void findBcc()
{
CL(bccno,0);
CL(pre,0);
dfs_clock=bcc_cnt=0;
REP(i,0,n) if(!pre[i]) dfs(i,-1);
REP(i,0,n) if(!bccno[i]){
++bcc_cnt;
dfs1(i);
}
} int main()
{
int a,b;
while(~scanf("%d%d",&n,&m))
{
e.clear();
REP(i,0,n) G[i].clear();
while(m--)
{
scanf("%d%d",&a,&b);
--a,--b;
e.push_back(Edge(b,0));
e.push_back(Edge(a,0));
G[a].push_back(e.size()-2);
G[b].push_back(e.size()-1);
}
findBcc();
if(bcc_cnt==1){
printf("0\n");
continue;
}
CL(du,0);
REP(u,0,n){
REP(i,0,G[u].size()){
int v=e[G[u][i]].to;
if(bccno[u]!=bccno[v]) ++du[bccno[v]];
}
}
int ans=0;
REP(i,1,bcc_cnt+1){
if(du[i]==1) ++ans;
if(du[i]==0) ans+=2;
}
printf("%d\n",(ans+1)/2);
}
return 0;
}

  

UVA-10972 RevolC FaeLoN (边双连通+缩点)的更多相关文章

  1. UVA 10972 - RevolC FaeLoN(边-双连通分量)

    UVA 10972 - RevolC FaeLoN option=com_onlinejudge&Itemid=8&page=show_problem&category=547 ...

  2. UVA 10972 RevolC FaeLoN(边-双连通+缩点)

    很好的一道图论题,整整撸了一上午... 题意是给定一个无向图,要求将所有边变为有向边,求最少加入多少条有向边,使得该图强连通?这里先假设一个问题:给定一个无向子图,该子图具有怎样的性质才能使得将其无向 ...

  3. uva 10972 RevolC FaeLoN cdoj 方老师和农场

    //自己写的第一发tarjan 解:先进行双连通分解并缩点,分解后一定是一颗树,设叶节点个数为n那么答案就是(n+1)/2 关于双连通分量求解:在跑tarjan时判断每个点连向父节点的边是否是桥,如果 ...

  4. UVA - 10972 RevolC FaeLoN

    一道特别好的题qwq. 题目大意就是给你一个无向图,让你把边定向之后再加一些边使得这个图强连通,求最少需要加多少边. 一开始毫无头绪23333,数据范围让人摸不着头脑..... 然后开始画图,,,发现 ...

  5. UVA 10972 RevolC FaeLoN(边连通分量)

    坑了我一天的题目..跑了20ms挂了,就知道有个小毛病= = 无向图转有向图判强连通. 首先要知道什么样的无向图可以转化为强连通图?连通分量(环)自然是可以的:那么扩大范围(存在割顶),发现点连通分量 ...

  6. hdu 4612 Warm up 双连通缩点+树的直径

    首先双连通缩点建立新图(顺带求原图的总的桥数,事实上因为原图是一个强连通图,所以桥就等于缩点后的边) 此时得到的图类似树结构,对于新图求一次直径,也就是最长链. 我们新建的边就一定是连接这条最长链的首 ...

  7. 边双连通缩点+树dp 2015 ACM Arabella Collegiate Programming Contest的Gym - 100676H

    http://codeforces.com/gym/100676/attachments 题目大意: 有n个城市,有m条路,每条路都有边长,如果某几个城市的路能组成一个环,那么在环中的这些城市就有传送 ...

  8. POJ 3177 Redundant Paths (边双连通+缩点)

    <题目链接> <转载于 >>>  > 题目大意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新 ...

  9. POJ - 3177 Redundant Paths (边双连通缩点)

    题意:在一张图中最少可以添加几条边,使其中任意两点间都有两条不重复的路径(路径中任意一条边都不同). 分析:问题就是最少添加几条边,使其成为边双连通图.可以先将图中所有边双连通分量缩点,之后得到的就是 ...

  10. poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 503 ...

随机推荐

  1. SQL Server自定义字符串分割函数——Split

    我相信大部分人都碰到过,处理数据的时候,字段的值是以 ',' (逗号)分隔的形式,所以我也不能避免. 然后我才知道,sql 是没有类似于 C# 和 Javascript 这种分割字符串的方法.( Sp ...

  2. ruby中的self

    self,自己,在ruby中表示当前对象或默认对象.程序执行的任一时刻,有且仅有一个self. 1.谁成为self,在什么位置成为self? 要知道哪个对象是self,就必须知道当前的上下文.上下文主 ...

  3. hihocoder1479 三等分

    地址:http://hihocoder.com/problemset/problem/1479 题目: 三等分 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近 ...

  4. WLAN QOS

    1. 理解WLAN QOS 1.1       WLAN QOS简介 802.11的WLAN网络为用户提供了公平竞争无线资源的无线接入服务,但不同的应用需求对于网络的要求是不同的,而原始802.11网 ...

  5. Android开发环境配置到第一个程序所遇到的问题

    1.安装顺序 先jdk,最后是1.7或1.8吧,配置环境变量:然后是sdk,配置环境变量:sdk安装之后即可以通过SDK Manager进行其他包的安装. 2.sdk及其他包的安装,以一张图表示,对于 ...

  6. C++ 第三十三天

    Ⅰ.类成员函数的隐式参数 T *const this . 就是说对于某个类的成员函数 returnType function() 的真实面目其实是这样的 returnType function(T * ...

  7. SQL学习笔记之MySQL中真假“utf8” 问题

    0x00 MySQL中UTF8报错 最近我遇到了一个 bug,我试着通过 Rails 在以“utf8”编码的 MariaDB 中保存一个 UTF-8 字符串,然后出现了一个离奇的错误: Incorre ...

  8. 2_jenkins_git创建创建及项目构建

    确保jenkins服务正常工作 进入WEB界面 查看git插件是否正常安装 "管理系统" --> "管理插件" "可选插件" 然后找到 ...

  9. Eclipse安装zylin[转]

    本文转载自:https://blog.csdn.net/dns888222/article/details/9263485 Eclipse安装zylin 在网上搜的是安装页为http://www.zy ...

  10. gcc编译出错---make[5]: *** [s-attrtab] Killed

    内存不足导致的编译出错,解决方法是增加swapfile. root@ubuntu:home# swapon -s Filename    Type            Size    Used    ...