zoukankan      html  css  js  c++  java
  • [LUOGU] P2783 有机化学之神偶尔会做作弊

    缩点+lca

    大水题。

    洛谷恶意评分++

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <cstring>
    using namespace std;
    const int N=10005;
    int n,m,low[N],dfn[N],tim,stk[N],tt,id[N],dep[N],son[N],siz[N],tot,fa[N],top[N];
    vector<int>G[N],T[N];
    bool ins[N];
    void tarjan(int x,int from) {
        low[x]=dfn[x]=++tim;stk[++tt]=x;ins[x]=1;
        for(int i=0;i<G[x].size();i++) {
            int v=G[x][i];
            if(v==from) continue;
            if(!dfn[v]) {tarjan(v,x);low[x]=min(low[x],low[v]);}
            else if(ins[v]) low[x]=min(low[x],dfn[v]);
        }
        if(dfn[x]==low[x]) {
            ++tot;
            id[x]=tot;ins[x]=0;
            while(stk[tt]!=x) ins[stk[tt]]=0,id[stk[tt--]]=tot;
            tt--;
        }
    }
    void dfs(int x) {
        siz[x]=1;
        for(int i=0;i<T[x].size();i++) {
            int v=T[x][i];
            if(v!=fa[x]) {fa[v]=x;dep[v]=dep[x]+1;dfs(v);siz[x]+=siz[v];if(siz[v]>siz[son[x]]) son[x]=v;}
        }
    }
    void dfs(int x,int Top) {
        top[x]=Top;
        if(!son[x]) return ;
        dfs(son[x],Top);
        for(int i=0;i<T[x].size();i++) {
            int v=T[x][i];
            if(v!=fa[x]&&v!=son[x]) dfs(v,v);
        }
    }
    int lca(int x,int y) {
        while(top[x]!=top[y]) 
            (dep[top[x]]>=dep[top[y]]?x=fa[top[x]]:y=fa[top[y]]);
        return dep[x]<dep[y]?x:y;
    }
    void print(int x) {
        if(x) print(x>>1);
        if(x) putchar('0'+(x&1));
    }
    int main() {
        scanf("%d%d",&n,&m);
        for(int i=1,u,v;i<=m;i++) {
            scanf("%d%d",&u,&v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,0);
        for(int i=1;i<=n;i++) {
            for(int j=0;j<G[i].size();j++) {
                int v=G[i][j];
                if(id[i]!=id[v]) T[id[i]].push_back(id[v]);
            }
        }
        dfs(1);
        dfs(1,1);
        scanf("%d",&m);
        for(int i=1,u,v;i<=m;i++) {
            scanf("%d%d",&u,&v);
            int l=lca(id[u],id[v]);
            if(dep[id[u]]+dep[id[v]]-dep[l]-dep[l]+1==0) {puts("0") ;continue;}
            print(dep[id[u]]+dep[id[v]]-dep[l]-dep[l]+1);
            printf("
    ");
        }
        return 0;
    }
    化学
  • 相关阅读:
    Redis源代码分析(十三)--- redis-benchmark性能測试
    kvm中运行kvm
    umount.nfs device busy day virsh extend diskSpace, attachDisk
    ultravnc
    openNebula dubug
    maintenance ShellScripts
    virsh VMI deploy data serial xml
    cloud computing platform,virtual authentication encryption
    基于C 的libvirt 接口调用
    storage theory
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9796761.html
Copyright © 2011-2022 走看看