hdu 3352 求边双联通分量模板题(容器)
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树
找叶子节点的个数*/
#include<stdio.h>
#include<string.h>
#define N 1100
int top[N],ma[N][N],dfn[N],low[N],index,f[N][N],n;
int Min(int a,int b) {
return a>b?b:a;
}
void tarjan(int u,int pre) {//
dfn[u]=low[u]=++index;
int i;
for(i=0;i<top[u];i++) {
int v=ma[u][i];
if(v==pre)continue;
if(!dfn[v]) {
tarjan(v,u);
low[u]=Min(low[u],low[v]);//
if(low[v]>dfn[u])//标记桥
f[u][v]=f[v][u]=1;
}
else
low[u]=Min(low[u],dfn[v]);
}
}
int cnt,c[N];
void dfs(int u,int fa) {//缩点
int i;
c[u]=cnt;//不能放到循环里面,
for(i=0;i<top[u];i++) {
int v=ma[u][i];
if(!f[u][v]&&!c[v]&&v!=fa)//桥不能走,不能回头路,没有被缩过
dfs(v,u);
}
return ;
}
int degree[N];
int slove() {
int i,j,b;
cnt=1;
memset(c,0,sizeof(c));
for(i=1;i<=n;i++)//缩点
if(!c[i]) {
dfs(i,-1);
cnt++;
}
memset(degree,0,sizeof(degree));
for(i=1;i<=n;i++)
for(j=0;j<top[i];j++){
b=ma[i][j];
if(c[i]!=c[b]) {//所有边中
degree[c[i]]++;
degree[c[b]]++;//记录度数
}
}
int leave=0;
for(i=1;i<cnt;i++) {//度数为一的叶子节点,因为为双向边
if(degree[i]==2)
leave++;
}
return (leave+1)/2;
}
int main() {
int m,i,a,b,ans;
while(scanf("%d%d",&n,&m)!=EOF) {
memset(top,0,sizeof(top));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(f,0,sizeof(f));
index=0;
while(m--){
scanf("%d%d",&a,&b);
ma[a][top[a]++]=b;//容器
ma[b][top[b]++]=a;
}
for(i=1;i<=n;i++)
if(!dfn[i])
tarjan(i,-1);
ans=slove();
printf("%d\n",ans);
}
return 0;
}
hdu 3352 求边双联通分量模板题(容器)的更多相关文章
- poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h>//用容器写在3177这个题上会超内存,但 ...
- POJ 2942 Knights of the Round Table 补图+tarjan求点双联通分量+二分图染色+debug
题面还好,就不描述了 重点说题解: 由于仇恨关系不好处理,所以可以搞补图存不仇恨关系, 如果一个桌子上面的人能坐到一起,显然他们满足能构成一个环 所以跑点双联通分量 求点双联通分量我用的是向栈中pus ...
- 【UVA10972】RevolC FaeLoN (求边双联通分量)
题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...
- 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- POJ3177 & 求边双联通分量
题意: 给一张无向图,求加多少边使原图任意两点边双联通. SOL: 一个不会写边双点双强联通的傻逼. 一个结论:把一棵树变成满足条件的图需要加的边使入度为1的点数+1除以2.------>就是树 ...
- POJ 3352 Road Construction 双联通分量 难度:1
http://poj.org/problem?id=3352 有重边的话重边就不被包含在双连通里了 割点不一定连着割边,因为这个图不一定是点连通,所以可能出现反而多增加了双连通分量数的可能 必须要用割 ...
- cf999E (强联通分量模板题)
给出n个点m条边的有向图,问至少添加多少条边使得任何点都可以从s点出发可达 #include<bits/stdc++.h> #define forn(i, n) for (int i = ...
- ARC062 - F. Painting Graphs with AtCoDeer (Polya+点双联通分量)
似乎好久都没写博客了....赶快来补一篇 题意 给你一个 \(n\) 个点 , 没有重边和自环的图 . 有 \(m\) 条边 , 每条边可以染 \(1 \to k\) 中的一种颜色 . 对于任意一个简 ...
- [J]computer network tarjan边双联通分量+树的直径
https://odzkskevi.qnssl.com/b660f16d70db1969261cd8b11235ec99?v=1537580031 [2012-2013 ACM Central Reg ...
随机推荐
- canvas制作饼图和环形图,使用Excanvas兼容IE67
excanvas 地址:http://excanvas.sourceforge.net/ <!DOCTYPE html> <html> <head> <met ...
- 自适应阈值分割—大津法(OTSU算法)C++实现
大津法是一种图像灰度自适应的阈值分割算法,是1979年由日本学者大津提出,并由他的名字命名的.大津法按照图像上灰度值的分布,将图像分成背景和前景两部分看待,前景就是我们要按照阈值分割出来的部分.背景和 ...
- hdu5673-Robot
题目: http://acm.hdu.edu.cn/showproblem.php?pid=5673 好久没打BC,当时这场过了3题,hack了一个,马马虎虎吧,因为前三个题确实不难. 这个是那场的第 ...
- Django day08 多表操作 (三) 基于对象的跨表查询 基于双下划线的多表查询
一: 基于对象的跨表查询 1. 一对一 正向: 反向: 2. 一对多 正向: 反向: 3.多对多 正向: 反向: 4.*****基于对象的多表查询 二: 基于双下划线的多表查询 1. 连表查询 一对一 ...
- Python 34(进程了解)
一:僵尸进程与孤儿进程 测试程序: 基本概念: 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中. ...
- Oracle 批量插入值
工作中常遇到将Excel文档数据转为SQL语句,然后再将SQL语句插入到数据库已完成数据转移保存到数据库中,下面介绍下如何一次性插入多条SQL语句,先抛个图: 由于真实数据不变给大家看,所以这里是做了 ...
- ROS-URDF-建立模型
前言:建立一个简单的urdf模型 详解请参看教程http://wiki.ros.org/urdf/Tutorials/Building%20a%20Visual%20Robot%20Model%20w ...
- 一个能让cin和scanf 一样快的方法:
cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱.正因为这个兼容性的 ...
- struts2结果处理、获取参数(二)
结果处理 1.转发 type可以不写,默认就是转发 <package name="hello" namespace="/hello" extends=&q ...
- 关于sizeof()、size()的有些问题
#include<iostream>using namespace std; int main() { char a[] = "abcdefg"; string s = ...