CF732F Tourist Reform

挖坑(看看这张PPT)吧


代码

//By AcerMo%%%尹兄 
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=4e5+5;
int n,m,l,id,ind,root,mx;
int c[N],x[N],y[N];
int dfn[N],low[N],sta[N];
bool to[N],vis[N],g[N*2];
int head[N],nxt[N*2],t[N*2],mark[N*2];
inline int read()
{
    int e=0;char ch=getchar();
    while (ch>'9'||ch<'0') ch=getchar();
    while (ch>='0'&&ch<='9') e=e*10+ch-'0',ch=getchar();
    return e;
}
void add(int e,int y,int z) 
{
    t[++l]=y;mark[l]=z;nxt[l]=head[e];head[e]=l;
    t[++l]=e;mark[l]=z;nxt[l]=head[y];head[y]=l;
    return ;
}
void tarjan(int e) 
{
    dfn[e]=low[e]=++ind;sta[ind]=e;vis[e]=1;
    for (int i=head[e];i;i=nxt[i]) 
    if (!g[i]) 
    {
        g[i]=g[i^1]=1;
        if (y[mark[i]]!=t[i]) to[mark[i]]=1;
        if (!dfn[t[i]]) 
        {
            tarjan(t[i]);
            low[e]=min(low[e],low[t[i]]);
        } 
        else if (vis[t[i]]) 
            low[e]=min(low[e],dfn[t[i]]);
    }
    if (dfn[e]==low[e]) 
    {
        id++;int size=0;
        while (sta[ind+1]!=e) 
        {
            c[sta[ind]]=id;size++;
            vis[sta[ind--]]=0;
        }
        if (size>mx) mx=size,root=id;
    }
    return ;
}
void dfs(int e,int z) 
{
    for (int i=head[e];i;i=nxt[i])
    if (t[i]!=z) 
    {
        if (c[y[mark[i]]]==t[i]) to[mark[i]]=1;
        else to[mark[i]]=0;
        dfs(t[i],e);
    }
    return ;
}
int main() 
{
    n=read();m=read();l=1;
    for (int i=1;i<=m;i++)
        x[i]=read(),y[i]=read(),add(x[i],y[i],i);
    tarjan(1);printf("%d\n",mx);l=0;
    memset(head,0,sizeof(head));
    for (int i=1;i<=m;i++)
        if (c[x[i]]!=c[y[i]]) add(c[x[i]],c[y[i]],i);
    dfs(root,0);
    for (int i=1;i<=m;i++)
    {
        if (to[i]) swap(x[i],y[i]);
        printf("%d %d\n",x[i],y[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/80977984
今日推荐