一次dfs判断有没有环 两次dfs求最长路 第一次记录最长路和次长路 第二次求出答案
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define maxn 100010
#pragma comment(linker, "/STACK:36777216")
using namespace std;
struct Edge
{
int to,len;
int next;
} edges[2000010];
int N,M;
int cnt;
int head[maxn];
bool vis[maxn];
void addedge(int u,int v,int w)
{
edges[cnt].to=v,edges[cnt].len=w,edges[cnt].next=head[u],head[u]=cnt++;
}
int kid[maxn];
int dp[maxn][2];
int ans;
bool dfs(int u,int fa)
{
vis[u]=true;
int i,j;
for(i=head[u]; i!=-1; i=edges[i].next)
{
Edge& e=edges[i];
if(e.to==fa) continue;
if(vis[e.to])
{
return true;
}
if(dfs(e.to,u))
{
return true;
}
}
return false;
}
void dfs1(int u,int fa)
{
vis[u]=true;
int i,j;
dp[u][1]=dp[u][0]=0;
for(i=head[u]; i!=-1; i=edges[i].next)
{
Edge& e=edges[i];
if(e.to==fa) continue;
dfs1(e.to,u);
if(dp[e.to][0]+e.len>dp[u][0])
{
dp[u][1]=dp[u][0];
dp[u][0]=dp[e.to][0]+e.len;
kid[u]=e.to;
}
else if(dp[e.to][0]+e.len>dp[u][1])
{
dp[u][1]=dp[e.to][0]+e.len;
}
}
}
void dfs2(int root,int fa)
{
int i,j;
for(i=head[root]; i!=-1; i=edges[i].next)
{
Edge& e=edges[i];
if(e.to==fa) continue;
if(e.to!=kid[root])
{
if(dp[root][0]+e.len>dp[e.to][0])
{
dp[e.to][1]=dp[e.to][0];
dp[e.to][0]=dp[root][0]+e.len;
kid[e.to]=root;
}
else if(dp[root][0]+e.len>dp[e.to][1])
{
dp[e.to][1]=dp[root][0]+e.len;
}
}
else
{
if(dp[root][1]+e.len>dp[e.to][0])
{
dp[e.to][1]=dp[e.to][0];
dp[e.to][0]=dp[root][1]+e.len;
kid[e.to]=root;
}
else if(dp[root][1]+e.len>dp[e.to][1])
{
dp[e.to][1]=dp[root][1]+e.len;
}
}
dfs2(e.to,root);
ans=max(ans,dp[e.to][0]);
}
}
int main()
{
// freopen("input.txt","r",stdin);
int i,j;
while(scanf("%d %d",&N,&M)==2)
{
cnt=0;
memset(head,-1,sizeof(head));
for(i=0; i<M; i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
addedge(x,y,z);
addedge(y,x,z);
}
for(i=1;i<=N;i++)
{
vis[i]=0;
}
for(i=1; i<=N; i++)
{
if(vis[i]) continue;
if(dfs(i,-1))
{
puts("YES");
break;
}
}
if(i!=N+1)
{
continue;
}
for(i=1;i<=N;i++)
{
vis[i]=0;
}
ans=0;
for(i=1; i<=N; i++)
{
if(vis[i]) continue;
dfs1(i,-1);
ans=max(ans,dp[i][0]);
dfs2(i,-1);
}
printf("%d\n",ans);
}
return 0;
}