poj 1523 SPF 求割点

来源:互联网 发布:路由器开放端口 编辑:程序博客网 时间:2024/06/05 05:18

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

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

还是忍不住吐槽:异常鬼畜的输入,还有输出,一不注意就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 1010vector <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;}




0 0