模板_poj1523SPF_割点以及点连通分支

来源:互联网 发布:数学老师知乎 编辑:程序博客网 时间:2024/06/05 06:32

poj1523题目链接

题意:

        图中是否有割点,去掉某个割点后有几个连通分量。

block[i]是去掉割点i后的连通分支个数。

割点:去掉这个点后,连通分支数比没去点这个点的连通分支数多1

但是根(根节点并且是割点的时候)节点的连通分量要比其他割点的连通分量的初始值少1

#include<stdio.h>#include<string.h>#include<vector>using namespace std;#define min(a,b) a<b?a:b #define max(a,b) a>b?a:bvector<int>e[1005];int low[1005];int dfn[1005];int time,n;int block[1005];int count;void tarjan(int u){int i,v;dfn[u]=low[u]=++time;for(i=0;i<e[u].size();i++){v=e[u][i];if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);if(dfn[u]<=low[v])     block[u]++;}else  low[u]=min(low[u],dfn[v]);}} int main(){int i,u,v;while(~scanf("%d",&u)&&u){for(i=0;i<1005;i++) e[i].clear(); n=0;time=0;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));scanf("%d",&v);n=max(max(n,u),v);e[u].push_back(v);e[v].push_back(u);while(scanf("%d",&u)&&u){scanf("%d",&v);n=max(max(n,u),v);e[u].push_back(v);    e[v].push_back(u);}        for(i=1;i<=n;i++)     block[i]=1;       block[1]=0;   tarjan(1);   printf("Network #%d\n",++count);      int flag=0;   for(i=1;i<=n;i++)   if(block[i]>1)   {   printf("  SPF node %d leaves %d subnets\n",i,block[i]); flag=1;   }   if(!flag)      printf("  No SPF nodes\n");printf("\n");     }return 0;} 


0 0
原创粉丝点击