为什么开O2会RE,不开O2就能AC?
查看原帖
为什么开O2会RE,不开O2就能AC?
987818
ysh54188楼主2024/9/15 15:09

代码如下:

//luogu P1099 acwing 351 
#include<bits/stdc++.h>
using namespace std;
#define maxn 333
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
int ans=INT_MAX,n,s;
struct nd{
    int to,dis,nxt;
}G[maxn<<1];
int cnt,head[maxn];
inline void add_edge(int a,int b,int c){
    G[++cnt]={b,c,head[a]},head[a]=cnt;
    G[++cnt]={a,c,head[b]},head[b]=cnt;
}
int vis[maxn],dis[maxn];
int dfs(int now){
    vis[now]=1;
    for(int i=head[now];i;i=G[i].nxt){
        if(!vis[G[i].to]){
            dis[G[i].to]=dis[now]+G[i].dis;
            dfs(G[i].to);
        }
    }
    vis[now]=0;
}
int full_d[maxn],cnt_d=1,flag;
void get_fd(int now,int to){
    full_d[cnt_d]=now;
    vis[now]=1;
    if(now==to){
        flag=1;
        return ;
    }
    ++cnt_d;
    for(int i=head[now];i;i=G[i].nxt){
        if(!vis[G[i].to]){
            get_fd(G[i].to,to);
            if(flag){
                return ;
            }
        }
    }
    vis[now]=0,--cnt_d;
}
void get_d(){
    int d0,d1,maxdis=0;
    dfs(1);
    for(int i=1;i<=n;++i){
        if(dis[i]>maxdis){
            d0=i,maxdis=dis[i];
        }
    }
    dis[d0]=0,maxdis=0;
    dfs(d0);
    for(int i=1;i<=n;++i){
        if(dis[i]>maxdis){
            d1=i,maxdis=dis[i];
        }
    }
    get_fd(d0,d1);
}
int d_dis[maxn];
void d_dfs(int now){
    vis[now]=1;
    for(int i=head[now];i;i=G[i].nxt){
        if(!vis[G[i].to]){
            d_dfs(G[i].to);
            d_dis[now]=max(d_dis[now],d_dis[G[i].to]+G[i].dis);
        }
    }
}
void solve(){
    for(int i=2;i<cnt_d;++i){
        d_dfs(full_d[i]);
    }
    int l=1,r=1,tmp=d_dis[full_d[1]];
    while(r<cnt_d){
        while(r<cnt_d&&dis[full_d[r+1]]-dis[full_d[l]]<=s){
            ++r,tmp=max(tmp,d_dis[full_d[r]]);
        }
        if(tmp>=dis[full_d[l]]&&tmp>=dis[full_d[cnt_d]]-dis[full_d[r]]){
            ans=tmp;
            return ;
        }
        ans=min(ans,max(dis[full_d[l]],dis[full_d[cnt_d]]-dis[full_d[r]]));
        ++l;
    }
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL),cout.tie(NULL);
    cin>>n>>s;
    for(int i=1;i<n;++i){
        int a,b,c;
        cin>>a>>b>>c;
        add_edge(a,b,c);
    }
    get_d();
    solve();
    cout<<ans<<endl;
	return 0;
}
//I will AK IOI.
//CCF is a naozi.
2024/9/15 15:09
加载中...