poj 1523 求割点把一个图分成几个联通部分
2014-07-20 16:10
507 查看
#include<stdio.h> #include<string.h> #define N 1100 struct node { int u,v,next; }bian[N*N*2]; int head ,dfn ,low ,index,cut ,yong,visit ,dd ,len,vis ; void init() { memset(head,-1,sizeof(head)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(cut,0,sizeof(cut)); index=0;yong=0; memset(visit,0,sizeof(visit)); } int Min(int a,int b) { return a>b?b:a; } void addedge(int u,int v) { bian[yong].u=u; bian[yong].v=v; bian[yong].next=head[u]; head[u]=yong++; } void tarjan(int u,int pre) { dfn[u]=low[u]=++index; int i; for(i=head[u];i!=-1;i=bian[i].next) { int v=bian[i].v; if(!dfn[v]) { tarjan(v,u); low[u]=Min(low[u],low[v]); if(low[v]>=dfn[u]) cut[u]++; } else low[u]=Min(low[u],dfn[v]); } if(pre<0) cut[u]--; } int main() { int a,b,i,j,in=0,flag; while(scanf("%d",&a),a) { scanf("%d",&b); init(); addedge(a,b); addedge(b,a); visit[a]=visit[b]=1; while(scanf("%d",&a),a) { scanf("%d",&b); addedge(a,b); addedge(b,a); visit[a]=visit[b]=1; } printf("Network #%d\n",++in); flag=0; for(i=1;i<=1000;i++) if(!dfn[i]&&visit[i]) tarjan(i,-1); for(i=1;i<=1000;i++) if(visit[i]&&cut[i]) if(cut[i]+1>0) { printf(" SPF node %d leaves %d subnets\n",i,cut[i]+1); flag=1; } if(flag==0) printf(" No SPF nodes\n"); printf("\n"); } return 0; }
相关文章推荐
- poj 1523 求割点把一个图分成几个联通部分
- n条直线划分一个平面 最多分成几个部分
- 对一个文件的切割分成几个小部分,文件的合并(将部分文件合并)
- poj 1032 将一个数分成几个不同的数之和,满足这些数的乘积最大。
- POJ-1523(无向图割点将图分成几部分)
- hdu 3691最小割将一个图分成两部分
- 一个由c/C++编译的程序占用的内存分为以下几个部分(转)
- POJ 2117--Electricity【点双联通 && 求删去一个点后,图最多有多少块连通】
- 把一个完全图分成两部分
- 一个网站的收入由那几个部分组成?
- Uva 10765 - Doves and bombs 求割点..找去掉某点一个连通图会变成几个部分..
- 一条直线可以把一个平面分成两部分,两条直线可分成4部分,20条直线最多可分几部分?
- 一个由c/C++编译的程序占用的内存分几个部分
- poj 2570 Fiber Network 一直每条边可以通过某些公司过去,问从a到b可以通过那几个公司(同一个)过去
- 分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
- 分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
- poj 2117 Electricity 求无向图中去掉一个点后最大的联通分支数 无向图有可能不联通 tarjan求割点模板
- poj 1523(无向联通图的割点)
- poj 1236 Network of Schools 1)至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 2)至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点
- 一个由c/C++编译的程序占用的内存分几个部分