蒟蒻用dfs,90分,第二个测试点MLE,求助
  • 板块P1395 会议
  • 楼主uliahradri
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/6/16 17:51
  • 上次更新2023/11/7 00:32:11
查看原帖
蒟蒻用dfs,90分,第二个测试点MLE,求助
223380
uliahradri楼主2020/6/16 17:51

思路是用dfs求出树的重心

#include<iostream>
#define gpt(i,a,b) for(int i=a;i<b;i++)
#define blb(i,a) for(int i=op[a];i;i=ne[i])
#include<cstdio>
using namespace std;
int n,m,mm=1,op[50004],ne[50004],to[50004],uliah[50004],rs[50004],minn=1999999999,min_;      //uliah:在每个点开会的距离和,rs:每个点的子树节点个数
void in_uint(int&adri){//快读
    adri=0;
    char chr=getchar();
    while(chr<'0'||chr>'9')chr=getchar();
    while(chr>='0'&&chr<='9'){
        adri*=10;
        adri+=chr-'0';
        chr=getchar();
    }
}
void adge(int a,int b){     //构建邻接表
    ne[mm]=op[a];
    op[a]=mm;
    to[mm++]=b;
    ne[mm]=op[b];
    op[b]=mm;
    to[mm++]=a;
}
void dfs_1(int u,int fa){       //维护rs[i]
    rs[u]=1;
    blb(i,u){
        int v=to[i];
        if(v==fa)continue;
        dfs_1(v,u);
        rs[u]+=rs[v];
    }
    return;
}
void dfs_2(int u,int fa){   //维护uliah[0];
    blb(i,u){
        int v=to[i];
        //cout<<u<<' '<<v<<' '<<fa<<' '<<uliah[u]<<' '<<rs[u]<<' '<<rs[v]<<'\n';
        if(v==fa)continue;
        uliah[v]=uliah[u]-rs[v]+n-rs[v];
        dfs_2(v,u);
    }
    return;
}
void dfs_3(int u,int fa){    //维护uliah[i]
    if(rs[u]==1){
        uliah[u]=0;
        return;
    }
    blb(i,u){
        int v=to[i];
        if(v==fa)continue;
        dfs_3(v,u);
        uliah[u]+=uliah[v]+rs[v];
    }
    return;
}
int main(){
    in_uint(n);
    gpt(i,0,n-1){
        int a,b;
        in_uint(a);a--;
        in_uint(b);b--;
        adge(a,b);
    }
    dfs_1(0,-999);
    dfs_3(0,-999);
    dfs_2(0,-999);
    gpt(i,0,n)if(uliah[i]<minn){        
        minn=uliah[i];
        min_=i;
    }
    cout<<min_+1<<' '<<minn;
    return 0;
}

有hack数据的话也可以发一下,谢谢

2020/6/16 17:51
加载中...