45 pts 求助
查看原帖
45 pts 求助
105230
Doubeecat楼主2020/9/28 21:37

调不出来哪里有问题……不知道是写法除了错还是

#include <cstring>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <stack>
#include <algorithm>
using namespace std;
#define ll long long
#define ri register int

char buf[1 << 20], *p1, *p2;
//#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)?EOF: *p1++)
template <typename T> inline void read(T &t) {
	ri v = getchar();T f = 1;t = 0;
	while (!isdigit(v)) {if (v == '-')f = -1;v = getchar();}
	while (isdigit(v)) {t = t * 10 + v - 48;v = getchar();}
	t *= f;
}
template <typename T,typename... Args> inline void read(T &t,Args&... args) {
    read(t);read(args...);
}

const int N = 10010;
const int M = 100010;

struct graph {
    int hd[N],to[M],nxt[M],tot = 1;
    inline void add(int u,int v) {to[++tot] = v;nxt[tot] = hd[u];hd[u ] = tot;}
    inline void addedge(int u,int v) {add(u,v);add(v,u);}
}g1,g2;

int n,m,dfn[N],low[N],cnt,num;
bool bridge[M];

void tarjan(int x,int ine) {
    dfn[x] = low[x] = ++cnt;
    for (int i = g1.hd[x];i;i = g1.nxt[i]) {
        int y = g1.to[i];
        if (!dfn[y]) {
            tarjan(y,i);
            low[x] = min(low[x],low[y]);
            if (low[y] > dfn[x]) {
                bridge[i] = bridge[i^1] = 1;
            } 
        } else if (i != (ine ^ 1)){
            low[x] = min(low[x],dfn[y]);
        }
    }
}

int c[N];

void dfs0(int x) {
    c[x] = num;
    for (int i = g1.hd[x];i;i = g1.nxt[i]) {
        int y = g1.to[i];
        if (!c[y] && !bridge[i]) {
            dfs0(y);
        }
    }
}

int top[N],son[N],dep[N],siz[N],fat[N];

void dfs1(int x,int f) {
    dep[x] = dep[f] + 1;
    siz[x] = 1;
    son[x] = 0;
    fat[x] = f;
    for (int i = g2.hd[x];i;i = g2.nxt[i]) {
        int v = g2.to[i];
        if (v != f) {
            dfs1(v,x);
            siz[x] += siz[v];
            if (siz[v] > siz[son[x]]) {
                son[x] = v;
            }
        }
    }
}

void dfs2(int x,int f) {
    if (son[f] == x) top[x] = top[f];
    else top[x] = x;
    if (son[x]) dfs2(son[x],x);
    for (int i = g2.hd[x];i;i = g2.nxt[i]) {
        int v = g2.to[i];
        if (v != f && v != son[x]) {
            dfs2(v,x);
        }
    }
} 

int LCA(int x,int y) {
    for (int tx = top[x],ty = top[y];tx != ty;) {
        if (dep[tx] > dep[ty]) {
            tx = top[x = fat[tx]];
        } else {
            ty = top[y = fat[ty]];
        }
    }
    return dep[x] < dep[y] ? x : y;
}

stack <int> s;

void output(int x) {
    while (!s.empty()) s.pop();
    while (x) {s.push(x % 2);x >>= 1;}
    while (!s.empty()) {printf("%d",s.top());s.pop();}
    puts("");
}

int main() {
    read(n,m);
    for (int i = 1;i <= m;++i) {int u,v;read(u,v);g1.addedge(u,v);}
    for (int i = 1;i <= n;++i) {if (!dfn[i]) tarjan(i,0);}
    for (int i = 1;i <= n;++i) {if (!c[i]) {++num,dfs0(i);}}
    for (int i = 2;i <= g1.tot;i++) {
        int x = g1.to[i^1],y = g1.to[i];
        if (c[x] == c[y]) continue;
        g2.add(x,y);
    }
    dfs1(1,0);dfs2(1,0);
    int k;read(k);
    for (int i = 1;i <= k;++i) {
        int x,y;read(x,y);x = c[x],y = c[y];
        output(dep[x] + dep[y] - 2 * dep[LCA(x,y)] + 1);
    }
}
2020/9/28 21:37
加载中...