hdu 3352 求边双联通分量模板题(容器)
2014-07-19 09:25
435 查看
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h> #include<string.h> #define N 1100 int top ,ma ,dfn ,low ,index,f ,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 ; 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 ; 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 求边双联通分量模板题(容器)
- HDU 1269 迷宫城堡 强联通分量模板存放处
- hdu 1827 强联通分量模板
- HDU 1878(1Y) (判断欧拉回路是否存在 奇点个数为0 + 一个联通分量 *【模板】)
- HDU 4738 --Caocao's Bridges 【无向图边双联通 && 求权值最小的桥 && 模板】
- 模板[有向图的强连通分量] -hdu 3072
- hdu 3836 强联通分量分解
- hdu 3394 图的双联通分量
- poj 3352 tarjan边双联通分量
- HDU 1269 迷宫城堡 (强联通分量,Tarjan算法)
- POJ 3352 Road Construction 双联通分量 难度:1
- tarjan求强联通分量 模板
- hdu1325最大联通分量+树中点与边数值关系
- POJ3352 Road Construction【边双联通分量】【Tarjan】
- hdu 2242(边双联通分量)
- HDU 1269 迷宫城堡 强连通分量模板题
- hdu1269 Tarjan强连通分量 模板
- hdu 1269 迷宫城堡(强联通分量,基础)
- poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)