[]基礎LGOJ5651最短演習を

あなたは、これが最もショートだと思いますか、実際には、最短パスではありません

この質問は、この文に直面している問題の難しさを理解することです。

「環GがゼロXORないように単純なエッジ量を確保しないように」

加重値が0である上に、図のリングが内部に表示されていることを意味し、特定のXOR

その特徴は何このリングを考えてみましょうか?

どのようにリングの両方を取得するには、その答えの反対側に歩いたことは同じでなければなりません!

二つの同一の数字がゼロにXORので、すなわち、リングの両側の右側は同じです

私達はちょうどツリー図でのみ走っを必要とするので、2点間の直接出力パスをXOR演算することができ

コード:

#include<bits/stdc++.h>
#define ll long long
#define N 500005
using namespace std;

int n,m,q,u,v;
ll w;

struct Edge
{
    int next,to;
    ll dis;
}edge[N<<1];
int cnt=0,head[N];

inline void add_edge(int from,int to,ll dis)
{
    edge[++cnt].next=head[from];
    edge[cnt].to=to;
    edge[cnt].dis=dis;
    head[from]=cnt;
}

int dep[N];
ll dis[N];
void dfs(int u,int fa)
{
    for(register int i=head[u];i;i=edge[i].next)
    {
        int v=edge[i].to;
        if(v==fa) continue;
        if(dep[v]!=0x3f3f3f3f) continue;
        dep[v]=dep[u]+1;
        dis[v]=dis[u]^edge[i].dis;
        dfs(v,u);
    }
}

template<class T>inline void read(T &res)
{
    char c;T flag=1;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}

int main()
{
    read(n);read(m);read(q);
    for(register int i=1;i<=m;++i)
    {
        read(u);read(v);read(w);
        add_edge(u,v,w);
        add_edge(v,u,w);
    }
    memset(dep,0x3f,sizeof(dep));
    dep[1]=0;
    dfs(1,0);
    while(q--)
    {
        read(u);read(v);
        printf("%lld\n",dis[u]^dis[v]);
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/tqr06/p/11854587.html