zoj 1119 SPF (tarjan求割点的联通分量数)

来源:互联网 发布:c4dr19中文版软件下载 编辑:程序博客网 时间:2024/04/28 12:22

题目地址

题目大意:给出多组边的关系,求图中割点的联通分量数

解题思路:tarjan求割点裸题,再加一个数组用来记录每个割点的联通分量数

#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <queue>#include <string>#include <map>#include <stack>#include <list>using namespace std;const int maxn = 1000+10;int dfn[maxn],low[maxn],cut[maxn],head[maxn];//dfn表示时间戳,low表示最小的祖先,cut表示该点的联通分量个数,head表示头节点的编号int index,num,edge;//index表示时间戳,num表示表头节点的编号,edge表示编号最大的点struct Node{    int v;    int next;}node[maxn*maxn];void Init(){    memset(dfn,-1,sizeof(dfn));    memset(head,-1,sizeof(head));    index = num = edge = 0;}void addedge(int u,int v) //构造静态链表{    node[num].v = v;    node[num].next = head[u];    head[u] = num++;}//对有向图void Tarjan(int u){    low[u] = dfn[u] = index++;    for(int i = head[u]; i != -1; i = node[i].next)    {        int v = node[i].v;        if(dfn[v] == -1) //当v点不在栈中时        {            Tarjan(v);            if(dfn[u] <= low[v]) //若v点的祖先不能到u点            {                cut[u]++;            }            else //若v点能返回到u点之前            {                low[u] = min(low[u],low[v]);            }        }        else//当v点在栈中        {            low[u] = min(dfn[v],low[u]);        }    }}int main(){    int n,m;    int cas = 1;    while(scanf("%d",&n) != EOF && n)    {        Init();        scanf("%d",&m);        n--; //从0开始编号        m--;        addedge(n,m);        addedge(m,n);        edge = max(edge,max(n,m));        while(scanf("%d",&n) != EOF && n)        {            scanf("%d",&m);            n--;            m--;            addedge(n,m);            addedge(m,n);            edge = max(edge,max(n,m));        }        cut[0] = 0; //0为根节点        for(int i = 1; i < edge; i++)  //本身也是一个联通分量           cut[i] = 1;        Tarjan(0);        printf("Network #%d\n",cas++);        int flag = 0;        for(int i = 0; i < edge; i++)        {            if(cut[i] > 1)            {                flag = 1;                printf("  SPF node %d leaves %d subnets\n",i+1,cut[i]);            }        }        if(!flag)          printf("  No SPF nodes\n");    }    return 0;}


0 0
原创粉丝点击