树形dpWA#34求调
查看原帖
树形dpWA#34求调
536651
TTTTLE楼主2022/8/16 17:06
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+25;
int n,m,tot=1,frt[N],dep[N],a,b,pre1[N],pre2[N],root;
ll ans,d1[N],d2[N],dis[N][2];
bool vis[N];
struct node{
	int nxt,to,t;
}e[N<<1];
inline void add(int u,int v,int t){
	e[++tot].nxt=frt[u],frt[u]=tot,e[tot].to=v,e[tot].t=t;
	e[++tot].nxt=frt[v],frt[v]=tot,e[tot].to=u,e[tot].t=t;
}
void dp(int x){
	vis[x]=1;
	for(int i=frt[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(vis[y])
			continue;
		dp(y);
		if(d1[y]+e[i].t>=d1[x])
			d2[x]=d1[x],d1[x]=d1[y]+e[i].t,pre2[x]=pre1[x],pre1[x]=y;
		else
			if(d2[x]<=d1[y]+e[i].t)
				d2[x]=d1[y]+e[i].t,pre2[x]=y;
	}
}
inline void bfs(int x,int tag){
	memset(vis,0,sizeof(vis));
	queue<int> q;
	vis[x]=1,q.push(x);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=frt[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(!vis[v]){
				dis[v][tag]=dis[u][tag]+e[i].t;
				vis[v]=1;
				q.push(v);
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	int u,v,t;
	while(m--){
		scanf("%d%d%d",&u,&v,&t);
		add(u,v,t);
	}
	dp(1);
	for(int i=1;i<=n;i++)
		if(d1[i]+d2[i]>=ans)
			ans=d1[i]+d2[i],root=i;
	for(int i=root;i;i=pre1[i])
		a=i;
	for(int i=root;i;i=pre2[i])
		b=i;
	bfs(a,0);
	bfs(b,1);
	ll len=0;
	for(int i=1;i<=n;i++)
		len=max(len,min(dis[i][0],dis[i][1]));
	printf("%lld",ans+len);
	return 0;
}
2022/8/16 17:06
加载中...