hihocoder-1183(割点,桥模板)

我就不晓得这个坑B题目为什么上面这个可以过

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn=500000+10;
const int maxv=1000000+10;

struct my{
       int v;
       int next;
};

struct lmjer{
       int x,y;
};

int adj[maxn],fa,root,dfn[maxn],low[maxn],dfsn,topp,tope;
bool cutpoint[maxv];
lmjer cutedge[maxn];
my bian[maxv*2];

bool cmp(const lmjer a,const lmjer b){
     if(a.x==b.x) return a.y<b.y;
     else return a.x<b.x;
}

void myinsert(int u,int v){
     bian[++fa].v=v;
     bian[fa].next=adj[u];
     adj[u]=fa;
}

void dfs(int x,int in_edge){
     low[x]=dfn[x]=++dfsn;
     int child=0;
     for (int i=adj[x];i;i=bian[i].next){
        int v=bian[i].v;
        if(!dfn[v]){
            dfs(v,i);
            low[x]=min(low[x],low[v]);
            if(low[v]>dfn[x]){
               int x=bian[i].v;
               int y=bian[i^1].v;
               cutedge[++tope].x=min(x,y);
               cutedge[tope].y=max(x,y);
            }
            if(low[v]>=dfn[x]){
                child++;
                if(x!=root || child>1){
                    cutpoint[x]=1;
                }
            }
        }
        else if(i!=(in_edge^1)){
            low[x]=min(low[x],dfn[v]);
        }
     }
}

int main(){
    fa=1;
    int n,m;
    int u,v;
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        myinsert(u,v);
        myinsert(v,u);
    }
    for (int i=1;i<=n;i++){
        if(!dfn[i]){
            root=i;
            dfs(i,0);;
        }
    }
    int sum=0;
    for (int i=1;i<=n;i++){
        if(cutpoint[i]) {sum++;printf("%d ",i);}
    }
    if(sum==0) printf("Null");
    printf("\n");
    sort(cutedge+1,cutedge+1+tope,cmp);
    for (int i=1;i<=tope;i++){
        printf("%d %d\n",cutedge[i].x,cutedge[i].y);
    }
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn=500000+10;
const int maxv=1000000+10;

struct my{
       int v;
       int next;
};

struct lmjer{
       int x,y;
};

int adj[maxn],fa,root,dfn[maxn],low[maxn],dfsn,cutpoint[maxn],topp,tope;
lmjer cutedge[maxn];
my bian[maxv*2];

bool cmp(const lmjer a,const lmjer b){
     if(a.x==b.x) return a.y<b.y;
     else return a.x<b.x;
}

void myinsert(int u,int v){
     bian[++fa].v=v;
     bian[fa].next=adj[u];
     adj[u]=fa;
}

void dfs(int x,int in_edge){
     low[x]=dfn[x]=++dfsn;
     int child=0;
     for (int i=adj[x];i;i=bian[i].next){
        int v=bian[i].v;
        if(!dfn[v]){
            dfs(v,i);
            low[x]=min(low[x],low[v]);
            if(low[v]>dfn[x]){
               int x=bian[i].v;
               int y=bian[i^1].v;
               cutedge[++tope].x=min(x,y);
               cutedge[tope].y=max(x,y);
            }
            if(low[v]>=dfn[x]){
                child++;
                if(x!=root || child>1){
                    cutpoint[++topp]=x;
                }
            }
        }
        else if(i!=(in_edge^1)){
            low[x]=min(low[x],dfn[v]);
        }
     }
}

int main(){
    fa=1;
    int n,m;
    int u,v;
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        myinsert(u,v);
        myinsert(v,u);
    }
    for (int i=1;i<=n;i++){
        if(!dfn[i]){
            root=i;
            dfs(i,0);;
        }
    }
    if(cutpoint==0) printf("Null");
    else {
     sort(cutpoint+1,cutpoint+1+topp);
     for (int i=1;i<=topp;i++){
        printf("%d ",cutpoint[i]);
     }
    }
    printf("\n");
    sort(cutedge+1,cutedge+1+tope,cmp);
    for (int i=1;i<=tope;i++){
        printf("%d %d\n",cutedge[i].x,cutedge[i].y);
    }
return 0;
}

猜你喜欢

转载自www.cnblogs.com/lmjer/p/9382476.html