POJ-1523-SPF

最近一直做周赛和电子科大的~抽空复习图论了

这个题就是求割点,算是模板题

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e5+1000;
int e,n,dep,son,head[maxn],pnt[maxn],nxt[maxn],low[maxn],dfn[maxn],cnt[maxn];
bool vis[maxn];
void AddEdge(int u,int v)
{
    pnt[e]=v;nxt[e]=head[u];head[u]=e++;
    pnt[e]=u;nxt[e]=head[v];head[v]=e++;
}
void DFS(int u)
{
    for(int i=head[u];i!=-1;i=nxt[i])
    {
        if(!vis[pnt[i]])
        {
            vis[pnt[i]]=1;
            dfn[pnt[i]]=low[pnt[i]]=dep++;
            DFS(pnt[i]);
            low[u]=min(low[u],low[pnt[i]]);
            if(low[pnt[i]]>=dfn[u])
            {
                if(u!=1)
                    cnt[u]++;
                else
                    son++;
            }
        }
        else
            low[u]=min(low[u],dfn[pnt[i]]);
    }
}
int main()
{
    int cas=1;
    while(1)
    {
        memset(head,-1,sizeof(head));
        memset(cnt,0,sizeof(cnt));
        memset(vis,0,sizeof(vis));
        e=n=son=0;
        int u,v;
        scanf("%d",&u);
        if(!u)
            break;
        n=max(n,u);
        scanf("%d",&v);
        n=max(n,v);
        AddEdge(u,v);
        while(1)
        {
            scanf("%d",&u);
            if(!u)
                break;
            n=max(n,u);
            scanf("%d",&v);
            n=max(n,v);
            AddEdge(u,v);
        }
        dep=1;
        dfn[1]=low[1]=dep++;
        vis[1]=1;
        DFS(1);
        if(cas>1)
            printf("\n");
        printf("Network #%d\n",cas++);
        if(son>1)
            cnt[1]=son-1;
        bool is=false;
        for(int i=1;i<=n;i++)
            if(cnt[i])
            {
                is=true;
                printf("  SPF node %d leaves %d subnets\n",i,cnt[i]+1);
            }
        if(!is)
            printf("  No SPF nodes\n");

    }
    return 0;
}


你可能感兴趣的:(割点)