[難しい] JZOJ6409グラフ理論

説明

n個の点により与えられるエッジがないヘビーエッジとループバックすることを確実にするために、図組成物を無向mです。
あなたはすべてのエッジを見つける必要があり、これらのエッジは正確にシンプルなリングに存在して会います。リングは、それが一度だけ、このリングを介してある点のすべてが含まれている場合にのみ、シンプルなリングとして知られています。
これらのエッジは作品の多くに気づいたかもしれない、あなただけのXORの出力を必要とし、その数はすることができます。


分析

  • しかし、の波の見直し\(Tarjanは\) 実際には、この単純な二点リングを求めています

  • 各点は、ダブルダブル、エッジ点の判定ポイントの数は、点ビスと等しいか否かを判断します

  • これは暴力を追求することはできません、どのように多くのポイントそれぞれの側隔世遺伝、先祖返り側とXOR記録することです

  • 同じポイント自体に反転点とエッジ点は確かビスの点であるから

  • 気持ち\(tarjan \)この種のものは、まだ少し良く書きますが、非常に遅く、非常に奇妙な走り


コード

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#define MAXN 1000005
#define MAXM 2000005
#define ll int
#define reg register ll
#define max(x,y) ((x>y)?(x):(y))
#define min(x,y) ((x<y)?(x):(y))
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define rep(i,a) for (reg i=last[a];i;i=next[i])

using namespace std;

ll last[MAXM],next[MAXM],tov[MAXM],id[MAXM];
ll dfn[MAXN],low[MAXN],stack[MAXN],where[MAXN],num[MAXN],xorval[MAXN];
ll n,m,tot,top,ans,sum,root=1,size;
bool bz[MAXN],cut[MAXN];
vector<ll>v[MAXN];

inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void link(ll x,ll y,ll z){next[++tot]=last[x],last[x]=tot,tov[tot]=y,id[tot]=z;}
inline void tarjan(ll x)
{
    dfn[x]=low[x]=++tot,bz[x]=1,stack[++top]=x;ll flag=0;
    rep(i,x)if (!dfn[tov[i]])
    {
        tarjan(tov[i]),low[x]=min(low[x],low[tov[i]]);
        if (low[tov[i]]>=dfn[x])
        {
            ++flag,++sum;ll tmp,total=0,xorsum=0;
            if (x!=root || flag>1)cut[x]=1;
            do
            {
                tmp=stack[top--],v[sum].push_back(tmp),total+=num[tmp],xorsum^=xorval[tmp];
            }
            while (tmp!=tov[i]);
            v[sum].push_back(x);
            if (total==v[sum].size())ans^=xorsum;
        }
    }
    else
    {
        if (dfn[tov[i]]>dfn[x])continue;
        ++num[x],xorval[x]^=id[i];
        low[x]=min(low[x],dfn[tov[i]]);
    }
}
int main()
{
    freopen("graph.in","r",stdin);
    freopen("graph.out","w",stdout);
    n=read(),m=read();
    fo(i,1,m)
    {
        ll x=read(),y=read();
        link(x,y,i),link(y,x,i);
    }
    tot=0,tarjan(1);
    printf("%d\n",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/horizonwd/p/11812593.html