求助!tarjan+倍增lca82分WA了第1和第8个点
查看原帖
求助!tarjan+倍增lca82分WA了第1和第8个点
227438
The_World_exe楼主2020/11/3 10:18

找了篇题解和自己对拍都对不出来,两个WA掉的点都是answer Too short on line 1.

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<stack>
using namespace std;
const int N=2e4+5;
const int M=5e4+5;
int n,m,tot;
int fir[N],cnt;
int dfn[N],low[N],vis[N];
int color,belong[N];
int ex_fir[N],ex_cnt,fa[N][25],dep[N];
stack<int>s;
stack<int>emp;
struct edge
{
    int v,nxt;
}e[M<<1],ex_e[M<<1];

void add(int u,int v)
{
    e[++cnt].v=v;
    e[cnt].nxt=fir[u];
    fir[u]=cnt;
}
void ex_add(int u,int v)
{
    ex_e[++ex_cnt].v=v;
    ex_e[ex_cnt].nxt=ex_fir[u];
    ex_fir[u]=ex_cnt;
}
void tarjan(int j,int x,int from)
{
    dfn[x]=low[x]=j;
    vis[x]=1;
    s.push(x);
    for(int i=fir[x];i!=0;i=e[i].nxt)
    {
        int to=e[i].v;
        if(to==from)continue;
        if(vis[to]==1)low[x]=min(dfn[to],low[x]);
        else
        {
            tarjan(j+1,to,x);
            low[x]=min(low[x],low[to]);
        }
    }
    if(dfn[x]==low[x])
    {
        color++;
        while(s.top()!=x)
        {
            int np=s.top();
            vis[np]=0;
            belong[np]=color;
            s.pop();
        }
        belong[x]=color;
        vis[x]=0;
        s.pop();
    }
    return;
}
void dfs(int x,int from)//初始化各个节点的20级父亲
{
    fa[x][0]=from;
    dep[x]=dep[from]+1;
    for(int i=1;i<=20;i++)
        fa[x][i]=fa[fa[x][i-1]][i-1];
    for(int i=ex_fir[x];i!=0;i=ex_e[i].nxt)
    {
        int to=ex_e[i].v;
        if(to==from)continue;
        dfs(to,x);
    }
}
int lca(int x,int y)//倍增找lca
{
	if(dep[x]<dep[y])swap(x,y);//保证x点在y点下方
	if(dep[x]!=dep[y])
		for(int k=20;k>=0;k--)
		if(dep[fa[x][k]]>=dep[y])x=fa[x][k];
	if(x==y)return x;
	for(int k=20;k>=0;k--)
		if(fa[x][k]!=fa[y][k])
		{
			x=fa[x][k];
			y=fa[y][k];
		}
	return fa[x][0];
}
void print(int dis)
{
    s=emp;
    while(dis>0)
    {
        if(dis&1)s.push(1);
        else s.push(0);
        dis>>=1;
    }
    while(s.empty()!=1)
    {
        printf("%d",s.top());
        s.pop();
    }
    printf("\n");
}
// ------以下是调试部分------
void output_tree()
{
    printf("tree:\n");
    for(int i=1;i<=n;i++)
    {
        for(int j=fir[i];j!=0;j=e[j].nxt)
            printf("(%d,%d) ",i,e[j].v);
        printf("\n");
    }
}
void output_extree()
{
    for(int i=1;i<=n;i++)
        printf("belong[%d]=%d\n",i,belong[i]);
    for(int i=1;i<=color;i++)
    {
        for(int j=ex_fir[i];j!=0;j=ex_e[j].nxt)
            printf("(%d,%d) ",i,ex_e[j].v);
        printf("\n");
    }
}
void output_fa()
{
    for(int i=1;i<=color;i++)
    {
        for(int j=0;j<=2;j++)
            printf("fa[%d][%d]=%d ",i,j,fa[i][j]);
        printf("\n");
    }
}
void output_dep()
{
    for(int i=1;i<=n;i++)
        printf("dep[%d]=%d\n",i,dep[i]);
}
// ------以上是调试部分------


int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    // output_tree();
    tarjan(1,1,1);
    // printf("after tarjan\n");
    // output_tree();
    for(int i=1;i<=n;i++)
    {
        for(int j=fir[i];j!=0;j=e[j].nxt)
        {
            int to=e[j].v;
            // printf("j=%d,to=%d ",j,to);
            // printf("belong[%d]=%d,belong[%d]=%d\n",i,belong[i],to,belong[to]);
            if(belong[i]!=belong[to])
            {
                // printf("add edge\n");
                ex_add(belong[i],belong[to]);
            }
        }
    }
    // output_extree();
    dfs(1,1);
    // output_dep();
    // output_fa();
    scanf("%d",&tot);
    for(int i=1;i<=tot;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        int _lca=lca(belong[x],belong[y]);
        int dis=dep[belong[x]]-dep[_lca]+dep[belong[y]]-dep[_lca]+1;
        // printf("dis=%d\n",dis);
        print(dis);
    }
    return 0;
}
// 10 11
// 1 5
// 5 6
// 6 8
// 8 9
// 9 10
// 8 10
// 5 2
// 4 2
// 4 3
// 3 5
// 3 7
2020/11/3 10:18
加载中...