98pts求调
查看原帖
98pts求调
250036
Authentic_k楼主2021/12/7 21:04

100pts是帮别人交的代码

#include<bits/stdc++.h>
#define int long long
#define INF 100000000000000
#define MAXN 210000
using namespace std;
bool vis[MAXN];
int dis1[MAXN],dis2[MAXN],up[MAXN];
int head[MAXN],nxt[MAXN],val[MAXN],to[MAXN],tot;
vector<int>link[MAXN],Fin;
set<int>son[MAXN];
int n,m,l,cnt,ans,Max_dis;
void add(int u,int v,int w)
{
	 tot++;
	 to[tot]=v;
	 nxt[tot]=head[u];
	 head[u]=tot;
	 val[tot]=w;
}
int dfs_down(int now,int fa)
{ 
//     cout<<"now: "<<now<<endl;
     vis[now]=true;
     link[cnt].push_back(now);
     dis1[now]=dis2[now]=0;
     for(int i=head[now];i;i=nxt[i])
     {
     	 int y=to[i],w=val[i];
     	 if(y==fa) continue;
     	 int dis=dfs_down(y,now)+w;
//     	 cout<<"dis: "<<now<<" "<<y<<" "<<dis<<endl;
     	 if(dis>dis1[now])
     	 {
     	 	dis2[now]=dis1[now];
     	 	dis1[now]=dis;
     	 	son[now].clear();
     	 	son[now].insert(y);
		 }
		 else if(dis==dis1[now])
		 {
		 	  son[now].insert(y);
		 }
		 else if(dis>dis2[now])
		 {
		 	  dis2[now]=dis;
		 }
	 }
	 if(dis1[now]==-INF&&dis2[now]==-INF) dis1[now]=dis2[now]=0;
     Max_dis=max(Max_dis,dis1[now]+dis2[now]);
	 return dis1[now];
}
void dfs_up(int now,int fa)
{
	 for(int i=head[now];i;i=nxt[i])
	 {
	 	 int y=to[i],w=val[i];
	 	 if(y==fa) continue;
	 	 if(son[now].count(y)) up[y]=max(up[now],dis2[now])+w;
	 	 else up[y]=max(up[now],dis1[now])+w;
	 	 dfs_up(y,now);
	 }
}
bool cmp(int a,int b)
{
	 return a>b;
}
int u,v,w;
signed main()
{
	cin>>n>>m>>l;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v>>w;
		u++;
		v++;
		add(u,v,w);
	    add(v,u,w);
	}
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
		   ++cnt;
           dfs_down(i,i);
           dfs_up(i,i);
           int res=INF;
           for(int j=0;j<link[cnt].size();j++)
           {
           	   res=min(res,max(dis1[link[cnt][j]],up[link[cnt][j]]));
		   }
		   Fin.push_back(res);
		}
	}
	sort(Fin.begin(),Fin.end(),cmp);
    ans=Max_dis;
	if(cnt>1)
    {
       ans=max(ans,Fin[0]+Fin[1]+l);
	}
	if(cnt>2)
	{
	   ans=max(ans,Fin[1]+Fin[2]+l+l);
	}
	cout<<ans<<endl;
}
2021/12/7 21:04
加载中...