lightoj 1291 无向图边双联通+缩点统计叶节点
题目链接: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 无向图边双联通+缩点统计叶节点的更多相关文章
- poj2942 Knights of the Round Table,无向图点双联通,二分图判定
点击打开链接 无向图点双联通.二分图判定 <span style="font-size:18px;">#include <cstdio> #include ...
- poj 3694双联通缩点+LCA
题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到 ...
- hdu 4612 双联通缩点+树形dp
#pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了 #include<stdio.h> ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
- POJ 3177 Redundant Paths 无向图边双联通基础题
题意: 给一个无向图,保证任意两个点之间有两条完全不相同的路径 求至少加多少边才能实现 题解: 得先学会一波tarjan无向图 桥的定义是:删除这条边之后该图不联通 一条无向边(u,v)是桥,当且仅当 ...
- Codeforces 1000 组合数可行线段倒dp 边双联通缩点求树直径
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std ...
- 无向图边双联通分量 tarjan 模板
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 500005 ...
- 边的双联通+缩点+LCA(HDU3686)
Traffic Real Time Query System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; type ...
随机推荐
- Android 官方新手指导教程
一.开始 1.建立第一个应用程序 依赖关系和先决条件 Android SDK ADT Plugin 20.0.0 或更高 (如果你使用eclipse的话) 欢迎来到Android应用程序开发! 这一节 ...
- requirejs+anjularjs+express框架
1.目录 2.首页login.html如下: <!DOCTYPE html><html> <head> <title>登录界面</title> ...
- awr相关指标解析
awr相关指标解析 2016年11月11日 15:09
- ios进行打包
原文转载:http://blog.csdn.net/azhou_hui/article/details/9058677 公司刚搞了个299美刀的仅提供真机测试的企业账号,这个不需要添加设备ID,而 ...
- iOS单例的两种实现
单例模式算是开发中比较常见的一种模式了.在iOS中,单例有两种实现方式(至少我目前只发现两种).根据线程安全的实现来区分,一种是使用@synchronized,另一种是使用GCD的dispatch_o ...
- JS判断终端(Android IOS)
function getMobileOperatingSystem() { var userAgent = navigator.userAgent || navigator.vendor || win ...
- 连接池dbcp pool
-package cn.gdpe.pool; import java.io.InputStream;import java.sql.Connection;import java.sql.Prepare ...
- DB2JAVIT:RC=9505解决方案
DB2JAVIT:RC=9505解决方案 题记:WIN7下装DB2,启动任务中心.控制中心报DB2JAVIT:RC=9505. 解决方案:进入(计算机—>管理—>本地用户和组)把用户加入到 ...
- WPF自定义DataGrid分页控件
新建Custom Control,名:PagingDataGrid 打开工程下面的Themes\Generic.xaml xaml里面代码替换如下 <Style x:Key="{x:T ...
- 生成四位随机数的PHP代码
纯数字的四位随机数 rand(1000,9999) 数字和字符混搭的四位随机字符串: function GetRandStr($len) { $chars = array( "a" ...