poj 1523 SPF 输出割点及割点分割的点集数目
2011-10-10 12:35
405 查看
注意,初始化时当期时间戳就设为1在这里没错,但在poj1144就会错
所以我改了改,初始化时就设为0了
求割点的思想图论书上介绍的很详细了,推荐北京大学出版社出版的《图论算法理论、实现及其应用》
View Code
所以我改了改,初始化时就设为0了
求割点的思想图论书上介绍的很详细了,推荐北京大学出版社出版的《图论算法理论、实现及其应用》
View Code
#include<stdio.h> #include<string.h> #define bug() {puts("bugbug");} const int M = 1010; int dfn[M],low[M]; int head[1010]; struct node{ int v; int next; }edge[100]; int subnet[M]; int vis[M]; int nodes,son; int tdfn; int tot=0; int min(int a,int b) { return a<b?a:b; } void dfs(int u) { int i,v;low[u]=dfn[u]=++tdfn; for(i=head[u];i!=-1;i=edge[i].next) { v=edge[i].v; if(!dfn[v]) { dfs(v);//to get low[v]; low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]) { if(u!=1) subnet[u]++; if(u==1) son++; } } low[u]=min(dfn[v],low[u]); } } void init() { int i; nodes=0;son=0;tdfn=0; for(i=1;i<=1000;i++) subnet[i]=1; memset(head,-1,sizeof(head)); memset(dfn,0,sizeof(dfn)); } void add(int u,int v) { edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } int main() { int i; int u,v,flag; int cases=1; while(scanf("%d",&u),u) { init(); scanf("%d",&v); if(u>nodes) nodes=u; if(v>nodes) nodes=v; add(u,v); add(v,u); while(scanf("%d",&u),u) { scanf("%d",&v); if(u>nodes) nodes=u; if(v>nodes) nodes=v; add(u,v); add(v,u); } if(cases>1) printf("\n"); printf("Network #%d\n",cases++); dfs(1);//printf("fdsf"); if(son>1) subnet[1]=son; flag=0; for(i=1;i<=nodes;i++) { if(subnet[i]>1) { flag=1; printf(" SPF node %d leaves %d subnets\n",i,subnet[i]); } } if(!flag) printf(" No SPF nodes\n"); } return 0; }
相关文章推荐
- poj 1523 SPF 输出割点及割点分割的点集数目
- poj_1523 SPF (求割点)
- POJ 1523 SPF [解题报告]
- poj 1523 SPF
- POJ 1523 SPF (割点,连通分量)
- POJ1523:SPF(无向连通图求割点)
- POJ 1523 SPF【求割点】
- POJ1523 SPF
- poj 1523 SPF 无向图关节点
- POJ - 1523 SPF
- 【连通图|关节点】POJ-1523 SPF
- POJ1523-SPF
- poj 1523 SPF(无向图点的连通性问题)
- poj 1523 SPF(双连通分量割点模板)
- poj 1523 SPF
- POJ 1523 SPF Tarjan求无向图割点
- POJ 1523 SPF(无向图割顶)
- poj 1523 SPF 无向图关节点
- POJ--1523 SPF(割点)
- poj 1523 SPF