HDU 4514 湫湫系列故事——设计风景线

来源:互联网 发布:c语言简单编程题目 编辑:程序博客网 时间:2024/05/22 07:02

一次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;}