不知道思路错哪了
查看原帖
不知道思路错哪了
375403
NASFsky楼主2022/7/25 19:30

虽然会T,但我不知道思路哪有问题

#include<bits/stdc++.h>
#define N 200200
#define int long long
using namespace std;
int n,ind,x,d[N],cnt,fa[N],dfn[N],loop[N];
int cutu,cutv,max_sum,root,ans=1e18+5,cnt1;
bool inloop[2*N];
struct node{int to,dis;};
vector<node>g[2*N];
void get_loop(int u) 
{
    dfn[u]=++ind;
    for(int i=0;i<g[u].size();i++)
	{
        int v=g[u][i].to;
        if(v==fa[u])continue;
        if(dfn[v]) 
		{
            if(dfn[v]<dfn[u])continue;
            loop[++cnt]=v;inloop[v]=1;
            for(;v!=u;v=fa[v])
            {
            	loop[++cnt]=fa[v];
            	inloop[fa[v]]=1;
			}
        } 
		else 
		{
			fa[v]=u;
			get_loop(v);
		}
    }
}
void dfs(int u,int fa,int sum)
{
	if(g[u].size()==1)
	{
		d[x]=max(d[x],sum);
		return;
	}
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].to;
		if(fa==v||inloop[v])continue;
		dfs(v,u,sum+g[u][i].dis);
	}
}
void dfs1(int u,int fa,int sum)
{
	bool flag=1;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].to;
//		cout<<v<<endl;
		if(fa==v)continue;
		if(!inloop[v])continue;
		if(cutu==u&&cutv==v||cutu==v&&cutv==u)
		{
//			cout<<cutu<<" "<<u<<" "<<cutv<<' '<<v<<endl;
			continue;
		}
//		cout<<v<<' '<<u<<" "<<sum+g[u][i].dis<<endl;
		flag=0;
		dfs1(v,u,sum+g[u][i].dis);
	}
	if(flag)
	{
		if(sum>max_sum)
		{
			root=u;
			max_sum=sum;
		}	
		return;
	}
}
signed main()
{
	cin>>n;
	for(int i=1,u,v,w;i<=n;i++)
	{
		cin>>u>>v>>w;
		g[u].push_back({v,w});
		g[v].push_back({u,w});
	}
	for(int i=1;i<=n;i++)if(!dfn[i])get_loop(i);
	for(int i=1;i<=cnt;i++)
	{
		x=i;
		dfs(loop[i],0,0);
		g[loop[i]].push_back({++cnt1+n,d[i]});
		g[cnt1+n].push_back({loop[i],d[i]});
		inloop[cnt1+n]=1;
//		cout<<loop[i]<<endl; 
	}
	loop[++cnt]=loop[1];
	for(int i=1;i<cnt;i++)
	{
		cutu=loop[i];cutv=loop[i+1];
		max_sum=-1;
		dfs1(1,0,0);
//		cout<<root<<" "<<max_sum<<endl;
		max_sum=-1;
		dfs1(root,0,0);
//		cout<<root<<" "<<max_sum<<endl;
		ans=min(ans,max_sum);
	}
	cout<<ans;
	return 0;
} 
2022/7/25 19:30
加载中...