2 条题解

  • 0
    @ 2025-10-8 16:57:33
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e4+10, M=1e5+10;
    vector<int> G1[N], G2[N<<1];
    struct{int x,y;}E[M];
    int n,m,tsp,cnt,dfn[N],low[N];
    stack<int> stk;
    void tarjan(int x)
    {
        dfn[x]=low[x]=++tsp;
        stk.push(x);
        for(int y:G1[x])
        {
            if(!dfn[y])
            {
                tarjan(y);
                low[x]=min(low[x], low[y]);
                if(dfn[x]==low[y])
                {
                    cnt++;
                    G2[x].push_back(cnt);
                    for(int z=-1;z!=y;)
                    {
                        z=stk.top();stk.pop();
                        G2[cnt].push_back(z);
                    }
                    
                }
            }
            else low[x]=min(low[x], dfn[y]);
        }
    }
    int D,dep[N<<1],d[N<<1],st[N<<1][20];
    void dfs(int x,int xfa)
    {
        dep[x]=dep[xfa]+1;
        st[x][0]=xfa;for(int i=1;i<=D;i++) st[x][i]=st[st[x][i-1]][i-1];
        for(int y:G2[x])if(y!=xfa)
        {
            d[y]=d[x]+(y<=n);
            dfs(y,x);
        }
    }
    int LCA(int x,int y)
    {
        if(dep[x]<dep[y]) swap(x,y);
        for(int i=D;i>=0;i--) if(dep[st[x][i]]>=dep[y]) x=st[x][i];
        if(x==y) return y;
        for(int i=D;i>=0;i--) if(st[x][i]!=st[y][i]) x=st[x][i],y=st[y][i];
        return st[x][0];
    }
    int dist(int x,int y)
    {
        int lca=LCA(x,y);
        int ans=d[x]+d[y]-2*d[lca]+(lca<=n)-2;
        return ans;
    }
    int main()
    {   
        while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
        {
            memset(G1,0,sizeof(G1));
            for(int i=1,x,y;i<=m;i++)
            {
                scanf("%d%d",&x,&y);if(x==y)continue;
                E[i]={x,y};
                G1[x].push_back(y);
                G1[y].push_back(x);
            }
            
            memset(G2,0,sizeof(G2));
            tsp=0;cnt=n;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
            for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i),stk.pop();
            
            D=log2(2*n);memset(dep,0,sizeof(dep));memset(st,0,sizeof(st));memset(d,0,sizeof(d));
            for(int i=1;i<=cnt;i++)if(dep[i]==0)dfs(i,0);
    
            int q;scanf("%d",&q);
            while(q--)
            {
                int i,j;scanf("%d%d",&i,&j);
                int ans=max({dist(E[i].x,E[j].x),dist(E[i].x,E[j].y),dist(E[i].y,E[j].x),dist(E[i].y,E[j].y)});
                printf("%d\n",ans);
            }
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:57:19
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e4+10,M=1e5+10;
      vector<int>G1[N],G2[N<<1];
      struct{int x,y;}E[M];
      int n,m,tsp,cnt,dfn[N],low[N];
      stack<int>stk;
      void tarjan(int x)
      {
          dfn[x]=low[x]=++tsp;
      	stk.push(x);
          for(int y:G1[x])
          {
              if(!dfn[y])
              {
                  tarjan(y);
                  low[x]=min(low[x],low[y]);
                  if(dfn[x]==low[y])
                  {
                      cnt++;
      				G2[x].push_back(cnt);
                      for(int z=-1;z!=y;)
                      {
                          z=stk.top();stk.pop();
      					G2[cnt].push_back(z);
                      }
                      
                  }
              }
              else low[x]=min(low[x],dfn[y]);
          }
      }
      int D,dep[N<<1],d[N<<1],st[N<<1][20];
      void dfs(int x,int xfa)
      {
          dep[x]=dep[xfa]+1;
          st[x][0]=xfa;for(int i=1;i<=D;i++) st[x][i]=st[st[x][i-1]][i-1];
          for(int y:G2[x])if(y!=xfa)
          {
      		d[y]=d[x]+(y<=n);
              dfs(y,x);
          }
      }
      int LCA(int x,int y)
      {
          if(dep[x]<dep[y]) swap(x,y);
          for(int i=D;i>=0;i--) if(dep[st[x][i]]>=dep[y]) x=st[x][i];
          if(x==y) return y;
          for(int i=D;i>=0;i--) if(st[x][i]!=st[y][i]) x=st[x][i],y=st[y][i];
          return st[x][0];
      }
      int dist(int x,int y)
      {
      	int lca=LCA(x,y);
      	int ans=d[x]+d[y]-2*d[lca]+(lca<=n)-2;
      	return ans;
      }
      int main()
      {   
          while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
          {
              memset(G1,0,sizeof(G1));
              for(int i=1,x,y;i<=m;i++)
              {
                  scanf("%d%d",&x,&y);if(x==y)continue;
      			E[i]={x,y};
                  G1[x].push_back(y);
      			G1[y].push_back(x);
              }
      		
      		memset(G2,0,sizeof(G2));
              tsp=0;cnt=n;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
              for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i),stk.pop();
              
              D=log2(2*n);memset(dep,0,sizeof(dep));memset(st,0,sizeof(st));memset(d,0,sizeof(d));
      		for(int i=1;i<=cnt;i++)if(dep[i]==0)dfs(i,0);
      
              int q;scanf("%d",&q);
              while(q--)
              {
                  int i,j;scanf("%d%d",&i,&j);
      			int ans=max({dist(E[i].x,E[j].x),dist(E[i].x,E[j].y),dist(E[i].y,E[j].x),dist(E[i].y,E[j].y)});
                  printf("%d\n",ans);
              }
          }
          return 0;
      }
      • 1

      *【圆方树】统计两边之间的割点[UVA1464交通实时查询系统]

      信息

      ID
      1487
      时间
      1000ms
      内存
      32MiB
      难度
      9
      标签
      递交数
      348
      已通过
      28
      上传者