求问两个相同的思路为什么前者快后者慢
查看原帖
求问两个相同的思路为什么前者快后者慢
42424
deamoon_2楼主2021/10/19 19:08

同一个思路,找树上直径中心然后向外贪心延伸,前者用结构体储存,后者直接开数组再加一些小优化(从结果上看是负优化了23333),结果前面的A了后面的T了#2#3#6的3个点,实在看不出为什么,求问大佬们哪里出了问题(

//AC的
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int n,m,num,vm,L,R;
int head[605];
struct egde{
    int v,to,next;
}a[605];//链式前向星 
struct pot{
    int f,k;
}b[305];//记录节点父亲和与其父亲的路径价值 
struct deep{
    int d,md,z;
}p[305];//记录深度、最深深度和是否被记录为中心节点 
void add(int x,int y,int v){
    a[++num].next=head[x];
    a[num].to=y;
    a[num].v=v;
    head[x]=num;
} 
void dfs1(int t,int tf)
{
    if(p[t].d>vm)
    {
        vm=p[t].d;
        L=t;
    }
    for(int i=head[t];i;i=a[i].next)
    {
        if(p[a[i].to].d<p[t].d+a[i].v&&a[i].to!=tf)
        {
            p[a[i].to].d=p[t].d+a[i].v;
            dfs1(a[i].to,t);
        }
    }
}
void dfs2(int t,int tf)
{
    if(p[t].d>vm)
    {
        vm=p[t].d;
        R=t;
    }
    for(int i=head[t];i;i=a[i].next)
    {
        if(p[a[i].to].d<p[t].d+a[i].v&&a[i].to!=tf)
        {
            p[a[i].to].d=p[t].d+a[i].v;
            b[a[i].to].f=t;
            b[a[i].to].k=a[i].v;
            dfs2(a[i].to,t);
        }
    }
}//两边dfs找直径 
void dfsmark(int t,int tf)
{
    p[t].md=p[t].d;
    for(int i=head[t];i;i=a[i].next)
    {
        if(a[i].to!=tf)
        {
            b[a[i].to].f=t;
            p[a[i].to].d=p[t].d+a[i].v;
            dfsmark(a[i].to,t);
            p[t].md=max(p[t].md,p[a[i].to].md);
        }
    }
}//标记深度 
void dfsfix(int t,int tf,int st)
{
    for(int i=head[t];i;i=a[i].next)
    {
        if(a[i].to!=tf)
        {
            p[a[i].to].d-=p[st].d;
            p[a[i].to].md-=p[st].d;
            dfsfix(a[i].to,t,st);
        }
    }
}//修改深度 
int main()
{
    int x,y,v,mid;
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d%d",&x,&y,&v);
        add(x,y,v);
        add(y,x,v);
    }
    dfs1(1,0);
    vm=0;
    for(int i=1;i<=n;i++)
    p[i].d=0;
    dfs2(L,0);
    v=0;
    if(n>1)
    {
        for(mid=R;mid;mid=b[mid].f)
        {
            v+=b[mid].k;
            if(v>=vm/2)
            {
                if(vm/2-(v-b[mid].k)>=b[mid].k/2)
                mid=b[mid].f;
                //cout<<endl<<mid<<' '<<v<<' '<<endl;
                break;
            }
        }
    }
    for(int i=1;i<=n;i++)
    p[i].d=0;
    //cout<<endl<<L<<' '<<R<<' '<<mid<<endl;
    dfsmark(mid,0);
    v=0;
    p[mid].z=1;
    while(v<=m)
    {
        int t=0,val=0;
        for(int i=1;i<=n;i++)
        {
            if(p[i].md>val&&p[b[i].f].z&&!p[i].z)
            {
                val=p[i].md;
                t=i;
            }
        }
        v+=p[t].d;
        if(v>m)
        {
            v-=p[t].d;
            //cout<<t<<' '<<v<<' ';
            cout<<p[t].md<<endl;
            break;
        }
        p[t].z=1;
        dfsfix(t,b[t].f,t);
    }
    return 0;
}
//TLE的
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int n,m,num,L,R;
int head[605],f[305],k[305],d[305],md[305],b[305];
struct egde{
    int next,to,v;
}a[605];
void add(int x,int y,int v)
{
    a[++num].next=head[x];
    a[num].to=y;
    a[num].v=v;
    head[x]=num;
}
void dfs1(int t,int tf)
{
    if(d[t]>d[L])
    L=t;
    for(int i=head[t];i;i=a[i].next)
    {
        if(d[t]+a[i].v>d[a[i].to]&&a[i].to!=tf)
        {
            d[a[i].to]=d[t]+a[i].v;
            dfs1(a[i].to,t);
        }
    }
}
void dfs2(int t,int tf)
{
    if(d[t]>d[L])
    R=t;
    for(int i=head[t];i;i=a[i].next)
    {
        if(d[t]+a[i].v>d[a[i].to]&&a[i].to!=tf)
        {
            d[a[i].to]=d[t]+a[i].v;
            f[a[i].to]=t;
            k[a[i].to]=a[i].v;
            dfs2(a[i].to,t);
        }
    }
}
void dfsmark(int t,int tf)
{
    md[t]=d[t];
    for(int i=head[t];i;i=a[i].next)
    {
        if(a[i].to!=tf)
        {
            d[a[i].to]=d[t]+a[i].v;
            f[a[i].to]=t;
            dfsmark(a[i].to,t);
            md[t]=max(md[t],md[a[i].to]);
        }
    }
}
void dfsfix(int t,int tf,int st)
{
    for(int i=head[t];i;i=a[i].next)
    {
        if(a[i].to!=tf)
        {
            d[a[i].to]-=d[st];
            md[a[i].to]-=d[st];
            dfsfix(a[i].to,t,st);
        }
    }
}
int main()
{
    int x,y,v;
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d%d",&x,&y,&v);
        add(x,y,v);
        add(y,x,v);
    }
    dfs1(1,0);
    for(int i=1;i<=n;i++)
    d[i]=0;
    dfs2(L,0);
    int mid=R;
    if(n>1)
    {
        v=0;
        while(mid)
        {
            v+=k[mid];
            if(v>=d[R]/2)
            {
                if(d[R]/2-(v-k[mid])>=k[mid]/2)
                {
                    mid=f[mid];
                    break;
                }
            }
            //cout<<mid<<' '<<v<<' '<<k[mid]<<endl;
            mid=f[mid];
        }
    }
    //cout<<endl<<L<<' '<<R<<' '<<mid<<' '<<v<<' '<<d[R]<<endl;
    for(int i=1;i<=n;i++)
    d[i]=0;
    dfsmark(mid,0);
    b[mid]=1;
    v=0;
    while(v<=m)
    {
        int t=0;
        for(int i=1;i<=n;i++)
        {
            if(!b[i]&&b[f[i]]&&md[i]>md[t])
            {
                t=i;
            }
        }
        v+=d[t];
        if(v>m)
        {
            cout<<md[t]<<endl;
            break;
        }
        b[t]=1;
        dfsfix(t,f[t],t);
    }
    return 0;
}
2021/10/19 19:08
加载中...