现在的位置: 首页 > 综合 > 正文

poj 1523 SPF 求割点

2018年01月11日 ⁄ 综合 ⁄ 共 2259字 ⁄ 字号 评论关闭

这道题的输入异常鬼畜。= =无法直视

题意:给一个图。输出割点以及删掉割点后形成几个连通块

还是忍不住吐槽:异常鬼畜的输入,还有输出,一不注意就PE

还有,注意到这道题的点不是按顺序给定你的。你需要建立一个point数组来存储点。代码如下。= = 套个模板一不小心就WA了。鬼畜的题、

//author: CHC
//First Edit Time:	2014-07-07 21:33
//Last Edit Time:	2014-07-07 21:33
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
#define MAXN 1010
vector <int> e[MAXN];
int dfn[MAXN],low[MAXN],pre[MAXN],n,m;
bool gedian[MAXN];
int times=0,tot=0;
char vis[MAXN];
int point[MAXN];
void tarjan_3(int u){
    dfn[u]=low[u]=++times;
    for(int i=0;i<(int)e[u].size();i++){
        int v=e[u][i];
        if(!dfn[v]){
            pre[v]=u;
            tarjan_3(v);
            low[u]=min(low[u],low[v]);
        }
        else if(pre[u]!=v){
            //else also can ac
            low[u]=min(low[u],dfn[v]);
        }
    }
}
void solve(){
    times=tot=0;
    memset(dfn,0,sizeof(dfn));
    memset(gedian,0,sizeof(gedian));
    memset(pre,0,sizeof(pre));
    tarjan_3(point[1]);
    //gedian 
    int cnt=0;
    for(int i=2;i<=point[0];i++){
        if(pre[point[i]]==point[1]) cnt++;
        else if(dfn[pre[point[i]]]<=low[point[i]])gedian[pre[point[i]]]=true;
    }
    if(cnt>1)gedian[point[1]]=true;
    /*
    for(int i=1;i<=n;i++){
        if(gedian[i])
        printf("%d ",i);
    }
    puts("\n");
    */
    return ;
}
void Addpoint(int x){
    if(vis[x])return ;
    vis[x]=1;
    int &num=point[0];
    point[++num]=x;
}
char vis1[MAXN];
void bfs(int x,int dian){
    queue <int> q;
    q.push(x);
    vis1[x]=1;
    while(!q.empty()){
        int now=q.front();
        q.pop();
        for(int i=0;i<(int)e[now].size();i++){
            int next=e[now][i];
            if(next==dian)continue;
            if(vis1[next])continue;
            //printf("%d ---> %d\n",now,next);
            vis1[next]=1;
            q.push(next);
        }
    }
}
int main()
{
    int x,y;
    int cas=0;
    int ff=1;
    while(~scanf("%d",&x)){
        if(x==0){
            if(ff==0)break;
            printf("Network #%d\n",++cas);
            puts("  No SPF nodes");
            puts("");
            ff=x;
            continue;
        }
        scanf("%d",&y);
        if(y==0)break;
        for(int i=0;i<MAXN;i++)e[i].clear();
        memset(vis,0,sizeof(vis));
        point[0]=0;
        e[x].push_back(y);
        e[y].push_back(x);
        Addpoint(x);
        Addpoint(y);
        while(~scanf("%d",&x)&&x){
            scanf("%d",&y);
            e[x].push_back(y);
            e[y].push_back(x);
            Addpoint(x);
            Addpoint(y);
        }
        ff=x;
        solve();
        int flag=0;
        printf("Network #%d\n",++cas);
        for(int i=1;i<=point[0];i++)
            if(gedian[point[i]]){
                int ans=0;
                memset(vis1,0,sizeof(vis1));
                for(int j=1;j<=point[0];j++){
                    if(point[j]==point[i])continue;
                    if(!vis1[point[j]]){
                        bfs(point[j],point[i]);
                        ans++;
                        //printf("point:%d\n",point[j]);
                    }
                }
                printf("  SPF node %d leaves %d subnets\n",point[i],ans);
                flag=1;
            }
        if(!flag){
            puts("  No SPF nodes");
        }
        puts("");
    }
    return 0;
}

抱歉!评论已关闭.