//自己写的第一发tarjan

解:先进行双连通分解并缩点,分解后一定是一颗树,设叶节点个数为n那么答案就是(n+1)/2

关于双连通分量求解:在跑tarjan时判断每个点连向父节点的边是否是桥,如果是桥的话,该点的后代
中,未被染色的节点一点构成一个双连通分量,那么将其染色。

染色完成后依次检查每一条边的两端是

否为两种不同的颜色,如果是,所对应的颜色的度+1,最后看多少个度为1的节点就知道有多少叶子节点

也就能得到答案了。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<string> using namespace std; const int MAXN=;
const int MAXM=; vector<int> G[MAXN];
int n,m,top,cnt1,cnt2;
bool vis[MAXN];
int color[MAXN],dfn[MAXN],low[MAXN];
int stk[MAXN];
int degree[MAXN]; void tarjan(int now,int fa){
cnt1++;
dfn[now]=low[now]=cnt1;
vis[now]=;
stk[top++]=now;
int sz=G[now].size();
for (int i=;i<sz;i++){
if (G[now][i]==fa) continue;
if (!vis[G[now][i]]){
tarjan(G[now][i],now);
low[now]=min(low[now],low[G[now][i]]);
if (low[G[now][i]]>dfn[now]){
cnt2++;
while (top>){
color[stk[--top]]=cnt2;
if (stk[top]==G[now][i]) break;
}
}
}
else{
low[now]=min(low[now],dfn[G[now][i]]);
}
}
} int main(){
while (scanf("%d%d",&n,&m)==){
cnt1=cnt2=top=;
memset(vis,,sizeof(vis));
memset(degree,,sizeof(degree));
memset(color,,sizeof(color));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(stk,,sizeof(stk));
for (int i=;i<=n;i++){
G[i].clear();
}
for (int i=;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
for (int i=;i<=n;i++){
if (dfn[i]==) tarjan(i,-);
}
if (cnt2==){
printf("0\n");
continue;
}
for (int i=;i<=n;i++){
int sz=G[i].size();
for (int j=;j<sz;j++){
if (color[i]!=color[G[i][j]]){
degree[color[i]]++;
}
}
}
int ans=;
for (int i=;i<=cnt2;i++){
if (degree[i]==) ans+=;
if (degree[i]==) ans+=;
}
printf("%d\n",(ans+)/);
}
return ;
}
/*
7 7
1 2
2 3
3 4
2 5
4 5
5 6
5 7 3 3
1 2
2 3
1 3 7 5
1 2
2 3
4 5
5 6
5 7
*/

uva 10972 RevolC FaeLoN cdoj 方老师和农场的更多相关文章

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

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

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

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

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

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

  4. UVA - 10972 RevolC FaeLoN

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

  5. UESTC_方老师和农场 2015 UESTC Training for Graph Theory<Problem L>

    L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  6. UESTC 899 方老师和农场 --双连通分量的构造

    首先将原图中的连通分量缩点,一定可以将原图缩成一棵树的形式,然后统计这棵树的叶子节点个数,答案就是(leaf+1)/2.这里不再证明,可以画个图看一下. (简单说明一下,首先把两个最近公共祖先最远的两 ...

  7. cdoj 851 方老师与素数 bfs

    方老师与素数 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  8. UESTC_方老师的分身 II CDOJ 915

    方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  9. UESTC_方老师分身 I CDOJ 914

    方老师分身 I Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

随机推荐

  1. Lowest Bit(hdoj1196)

    Lowest Bit Problem Description Given an positive integer A (1 <= A <= 100), output the lowest ...

  2. jquery multiselect控件

    http://www.erichynds.com/blog/jquery-ui-multiselect-widget

  3. KNN(k-nearest neighbor的缩写)又叫最近邻算法

    KNN(k-nearest neighbor的缩写)又叫最近邻算法 机器学习笔记--KNN算法1 前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的 ...

  4. 对话 UNIX: 关于 inode

    http://www.ibm.com/developerworks/cn/aix/library/au-speakingunix14/ WMI http://wiki.hudson-ci.org/di ...

  5. python图片小爬虫

    import re import urllib import os def rename(name): name = name + '.jpg' return name def getHtml(url ...

  6. uva 10382 Watering Grass_贪心

    题意:给你个矩形n*m,再给你n个圆的圆心坐标和半径,问最用最少用几个圆把这个矩形覆盖 思路:直接想发现这问题不容易,后来发现可以把圆看做区间(能把矩形面积覆盖),然后这个问题就容易解决了 #incl ...

  7. UML_行为图

    活动图是UML用于对系统的动态行为建模的另一种常用工具,它描述活动的顺序,展现从一个活动到另一个活动的控制流.活动图在本质上是一种流程图.活动图着重表现从一个活动到另一个活动的控制流,是内部处理驱动的 ...

  8. mysql root@::1 意义

    root@::1 ::1 是IPv6格式的 127.0.0.1

  9. 操作hadoop的经验积累

    操作hadoop的经验积累 Hadoop namenode –format 在执行格式化-format命令时,要避免namenode的namdespaceid与datanode的namespaceid ...

  10. Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别

    Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举.元组.结构体之间区别,首先从最简单的开始- ...