题目大意:将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. 工作笔记——web字体格式转换

    转载自:http://blog.csdn.net/xiaolongtotop/article/details/8316554 目前,文字信息仍是网站最主要的内容,随着CSS3技术的不断成熟,Web字体 ...

  2. 如何修改opencart的模版适合为mycncart系统使用

    如何修改opencart的模版适合为mycncart系统使用 mycncart跟随opencart的最新代码不断进行升级,并改造和不断加入中国特色的功能,因此opencart的模版均不能够拿来直接套用 ...

  3. python阳历转阴历,阴历转阳历

    #!/usr/bin/env python # coding:utf8 # author:Z time:2019/1/16 import sxtwl # 日历中文索引 ymc = [u"十一 ...

  4. xphrof出现502问题

    This is an xhprof bug and not a devel bug, but I thought I'd throw the workaround up here in case pe ...

  5. 基于HTML5 FileSystem API的使用介绍(转)

    FileSystem提供了文件夹和文件的创建.移动.删除等操作,大大方便了数据的本地处理, 而且所有的数据都是在沙盒(sandboxed)中,不同的web程序不能互相访问,这就保证了数据 的完整和安全 ...

  6. 获取Json字符串中某个key对应的value

    JSONObject jsonObj= JSONObject.fromObject(jsonStr); String value= jsonObj.getString(key);

  7. 前端虚拟接口mockjs的使用

    最近在学习VueJS,也进一步学习了ES6,看了一遍之后,难免手痒,所以想仿写点什么,但是数据是个问题,你总不能写个分页,写个轮播吧,但是在公司做自己的东西找后台要接口也不那么像回事,怎么办呢? 无意 ...

  8. clientWidth offsetWidth scrollWidth

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  9. pxe无人值守自动安装

    rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpmyum listyum upda ...

  10. linux 安装vscode

    滚动安装vscode 需要先添加源,然后install 以centos为例: sudo rpm --import https://packages.microsoft.com/keys/microso ...