题目链接:http://lightoj.com/volume_showproblem.php?problem=1291

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn = ;
const int INF = 0x3f3f3f; int pre[maxn],low[maxn],dfs_clock; int bccnum[maxn],bcc_cnt; //记录每个点属于哪个边联通分量;
bool isbridge[maxn*]; //isbridge[i],边i是不是桥;
int n,m;
int deg[maxn]; struct Edge{
int u,v;
int next;
Edge(int u=,int v=,int next=): u(u),v(v),next(next) {}
}edges[maxn*];
int head[maxn],cnt ; void addedge(int u,int v){
edges[cnt] = Edge(u,v,head[u]);
head[u] = cnt++;
} void init(){
memset(head,-,sizeof(head));
cnt = ;
} void tarjan(int u,int fa){
pre[u] = low[u] = dfs_clock++;
for(int i=head[u];i!=-;i=edges[i].next){
int v = edges[i].v;
if(v == fa) continue;
if(!pre[v]){
tarjan(v,u);
low[u] = min(low[u],low[v]);
if(low[v] > pre[u]) {isbridge[i] = true; isbridge[i^] = true;}
}
else
low[u] = min(low[u],pre[v]);
}
}
void dfs(int u){
bccnum[u] = bcc_cnt;
for(int i=head[u];i!=-;i=edges[i].next){
int v = edges[i].v;
if(bccnum[v] || isbridge[i]) continue;
dfs(v);
}
} void find_bcc(){
bcc_cnt = ;
memset(bccnum,,sizeof(bccnum));
for(int i=;i<n;i++){
if(!bccnum[i]){
bcc_cnt++;
dfs(i);
}
}
} void BuildnewG(){
memset(deg,,sizeof(deg));
/** for(int u=0;u<n;u++){
for(int i=head[u];i!=-1;i=edges[i].next){
int v = edges[i].v;
if(bccnum[u] != bccnum[v]){
deg[bccnum[u]]++;
deg[bccnum[v]]++;
}
}
} **/ //两种方法都可以;但下面这种要快些;
for(int i=;i<cnt;i+=){
if(isbridge[i]){
deg[bccnum[edges[i].u]]++;
deg[bccnum[edges[i].v]]++;
}
}
} int main()
{
// freopen("E:\\acm\\input.txt","r",stdin);
int T;
cin>>T;
for(int t=;t<=T;t++){
cin>>n>>m;
init();
for(int i=;i<=m;i++){
int a,b;
scanf("%d %d",&a,&b);
addedge(a,b);
addedge(b,a);
}
dfs_clock = ;
memset(pre,,sizeof(pre));
memset(isbridge,,sizeof(isbridge));
tarjan(,-); //找桥; find_bcc();
BuildnewG();
int ans = ;
for(int i=;i<=bcc_cnt;i++)
if(deg[i] == ) ans++; //如果/**...**/中找法,则deg[i] == 2,因为统计了两次。
if(ans%) ans = ans/+;
else ans = ans/;
printf("Case %d: %d\n",t,ans);
}
}

lightoj 1291 无向图边双联通+缩点统计叶节点的更多相关文章

  1. poj2942 Knights of the Round Table,无向图点双联通,二分图判定

    点击打开链接 无向图点双联通.二分图判定 <span style="font-size:18px;">#include <cstdio> #include ...

  2. poj 3694双联通缩点+LCA

    题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到 ...

  3. hdu 4612 双联通缩点+树形dp

    #pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了 #include<stdio.h> ...

  4. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  5. POJ 3177 Redundant Paths 无向图边双联通基础题

    题意: 给一个无向图,保证任意两个点之间有两条完全不相同的路径 求至少加多少边才能实现 题解: 得先学会一波tarjan无向图 桥的定义是:删除这条边之后该图不联通 一条无向边(u,v)是桥,当且仅当 ...

  6. Codeforces 1000 组合数可行线段倒dp 边双联通缩点求树直径

    A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std ...

  7. 无向图边双联通分量 tarjan 模板

    #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 500005 ...

  8. 边的双联通+缩点+LCA(HDU3686)

    Traffic Real Time Query System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  9. BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; type ...

随机推荐

  1. 详解SQL Server 2005 Express下的事件探查器

    安装Visual Studio 2008会有附带的SQL Server 2005 Express版 我们开发一般都用那个都不单独安装SQL Server的 大家都知道express版的sql是没有 事 ...

  2. JS中escape 方法和C#中的对应

    在项目中遇到js中escape过的json字符串,需要在C#中对应模拟编码,记得原来遇到过这个问题,但是当时没记录下来方案, 于是又搜索了一番,发现别人说的都是HttpUtility.UrlEncod ...

  3. dnsever 邮件记录

    记录,备忘

  4. Tomcat下work文件夹的作用

    1.打补丁,重启tomcat时要删除work文件夹,有缓存. 2.work目录只是tomcat的工作目录,也就是tomcat把jsp转换为class文件的工作目录 jsp,tomcat的工作原理: 当 ...

  5. 分享最近写的 两条sql语句

    1. 搭建基本环境 插入测试数据 insert into jgdm (jgdm,jgmc)  values('12300000000','河南省');insert into jgdm (jgdm,jg ...

  6. 《uname命令》-linux命令五分钟系列之五

    本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...

  7. Oracle数据库之视图与索引

    Oracle数据库之视图与索引 1. 视图简介 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改. 视图基于的表称为基表,视图是存储在数据字典里的一条SE ...

  8. MySql数据库3【优化1】表的优化

    一.表结构的优化 1.标准化  标准化是在数据库中组织数据的过程.其中包括,根据设计规则创建表并在这些表间建立关系:通过取消冗余度与不一致相关性,该设计规则可以同时保护数据并提高数据的灵活性.通常数据 ...

  9. Python面向对象OOP

    一 OOP     与C++和Java一样,Python同样具有OOP设计. 过程式:从前到后,一条一条,机器能接受的顺序性方式:方式大概为"首先你应该做什么,第二应该做什么,高级点的做点假 ...

  10. if exists和if not exists关键字用法

    在sql语名中,if not exists 即如果不存在,if exists 即如果存在. 下面学习下二者的用法. a,判断数据库不存在时 代码示例: if not exists(select * f ...