hdu 4514 树形dp hdu-4514 湫湫系列故事——设计风景线

本文介绍了一种使用深度优先搜索(DFS)来检测图中是否存在环的方法,并在图无环的情况下寻找最长路径的算法实现。通过递归DFS遍历节点,标记已访问状态以检测环路,同时记录节点间距离以确定最长路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 题目意思: 给你一张图,让你判断图中是否有环,如果没环求出最长的路径。 

一个dfs,判断是否走到同一个点,如是,则说明是有环,不是则走到最远处u,在以u为起点dfs。

发现不用pragma照样没事

#pragma comment <linker,"/STACK:1024000000,1024000000">
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
typedef long long LL;
const int N = 100010;
struct vertex {
    int head;  
}V[N];
int dis[N];
int vis[N];
struct edge{
    int v,w,next; //分别表示一个端点,权值 ,下一个兄弟的索引 
}E[N*10*2];
int top = 0;
int fg=0;
void add_edge(int u,int v,int w){
    E[top].v = v;
    E[top].w = w;
    E[top].next = V[u].head;
    V[u].head = top++;
}
int dfs(int cur,int pre){
    int i;
    vis[cur] = 1;
    for(i = V[cur].head ;  i != -1 ; i = E[i].next){
        if(E[i].v == pre)
        continue;
        if(vis[E[i].v] == 1)
        {
            fg = 1;
            return  0;
        }
        dis[E[i].v] = dis[cur] + E[i].w;
        if(!dfs(E[i].v,cur))
        return 0;
    }
    return 1;
}
void init(int n){
        int i;
        top = 0;
        memset(vis,0,sizeof(vis));
        memset(dis,0,sizeof(dis));
        for(i=0;i<=n;i++){
            V[i].head = -1;
        }
}
void debug(int key){
    int i;
    printf("%d %d\n",key,V[key].head);
    for(i = V[key].head ;i != -1;i = E[i].next){
        printf("%d :",E[i].v);
        //system("pause");
    }
    printf("\n");
}
int main()
{
    int i,j,k,n,m,u,v,w;
    int ans;
    while(scanf("%d%d",&n,&m)!=EOF){ 
        memset(dis,0,sizeof(dis));
         memset(vis,0,sizeof(vis));
        ans =0 ;
        for(i=0;i<=n;i++){
            V[i].head = -1;
        }
        top = 0;
        for(i=0;i<m;i++){
            scanf("%d%d%d",&u,&v,&w);
            add_edge(u,v,w);
            add_edge(v,u,w);
        }
        for(i=1;i<=n;i++){    
            if(vis[i])
            continue;
            memset(dis,0,sizeof(dis));
            if(dfs(i,-1) == 0){
                break;
            }
            int v = max_element(dis+1,dis+1+n) - dis;
            memset(dis,0,sizeof(dis));
            memset(vis,0,sizeof(vis));            
            if(dfs(v,-1) == 0){
                break;
            }
            v = max_element(dis+1,dis+1+n) - dis;
            ans =  max(ans,dis[v]);    
        }
        if(i>n) 
        printf("%d\n",ans);
        else printf("YES\n");
    }
    
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值