被沉默术士沉默沉默术士 2019-03-07 19:43
浏览 249

大佬帮我看看这道icpc的题目思路对不对为啥超时了?

https://vj.2vjd.cn/b02428b1bbcf4609f7b121c06ef01b09?v=1551834196**这是题目地址**
图片说明

#include<cstring>
#include<algorithm>
using namespace std;
int n,u,v,Min,x,b,Min2;
int cnt,head[35000];
struct Edge{
    int to,next;
}edge[35000];
int siz[35000],dp[35000],size[35000];
bool vis[35000];
void init(){
    cnt=0;
    Min=0x3f3f3f3f;
     Min2=0x3f3f3f3f;
    memset(head,-1,sizeof(head));
    memset(siz,0,sizeof(siz));
    memset(dp,0,sizeof(dp));
        memset(vis,false,sizeof(vis));
    for (int i=1;i<=35000;i++) size[i]=1;
}
void addEdge(int u,int v){
    edge[cnt]=Edge{v,head[u]};
    head[u]=cnt++;
    edge[cnt]=Edge{u,head[v]};
    head[v]=cnt++;
}
void dfs(int u,int p){
    siz[u]=1;
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].to;
        if(v==p){
            continue;
        }
        dfs(v,u);
        siz[u]+=siz[v];
        if(dp[u]<siz[v]){
            dp[u]=siz[v];
        }
    }
    dp[u]=max(dp[u],n-siz[u]);
    Min=min(Min,dp[u]);
}
void dfs2(int x)
{
    if(!vis[x])
    {
        vis[x]=1;
        for(int i=head[x];i!=-1;i=edge[i].next)
        {
            int d=edge[i].to;
            if(!vis[d])
            {
                dfs2(d);
                size[x]+=size[edge[i].next];
            }
        }
    }
}
void dfs3(int u,int p){
    siz[u]=1;
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].to;
        if(v==p){
            continue;
        }
        if (v==b) {
            continue;
        } 
        dfs3(v,u);
        siz[u]+=siz[v];
        if(dp[u]<siz[v]){
            dp[u]=siz[v];
        }
    }
    dp[u]=max(dp[u],Min-siz[u]);
    Min2=min(Min2,dp[u]);
}
int main(void){
    cin>>n;
    init();
    for(int i=0;i<n-1;i++){
        cin>>u>>v;
        addEdge(u,v);
    }
    dfs(1,-1);
    for(int i=1;i<=n;i++){
        if(dp[i]==Min) {b=i;dfs2(i);break;
        }
    }
    for(int i=1;i<=n;i++) if (Min==size[i]) u=i;
     memset(siz,0,sizeof(siz));
    memset(dp,0,sizeof(dp));
    dfs3(u,-1);
    cout<<n-Min+Min2<<endl; 
    return 0;
}

我的思路是求两次重心,麻烦大佬帮我看看有啥问题,求重心算法我是抄别人的,不是很理解qwq。。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 cgictest.cgi文件无法访问
    • ¥20 删除和修改功能无法调用
    • ¥15 kafka topic 所有分副本数修改
    • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
    • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
    • ¥40 串口调试助手打开串口后,keil5的代码就停止了
    • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
    • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
    • ¥50 C++五子棋AI程序编写
    • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。