hdu4514 湫湫系列故事——设计风景线

该博客介绍了如何使用树形动态规划(DP)解决在树结构中寻找最长直径的问题。作者提供了两种方法,一种是两次DFS,另一种是一次DFS,通过维护两个长度变量len和len2来找到最长路径。

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

求树的最长直径,之前做过hdu2196,套用那道题的思路,两次dfs,求出每个结点的最长直径,然后找出最大的即为整棵树的最长直径
#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstring>
#define M 100010
#define ME 1000010
using namespace std;
struct node{
    int to,val,next;
}edge[ME*2];
int head[M];
int tot;
int n,m;
int len[M],len2[M],lenid[M];
bool vis[M];
int ans;
void insert(int u,int v,int val){
    edge[tot].to=v;
    edge[tot].val=val;
    edge[tot].next=head[u];
    head[u]=tot++;
}
bool dfs(int u,int pre){   //判环
    vis[u]=true;
    int i,v;
    for(i=head[u];i!=-1;i=edge[i].next){
        v=edge[i].to;
        if(v==pre) continue;
        if(vis[v]||dfs(v,u)) return true;
    }
    return fals
HDU 4514是一道经典的算法题,要求我们在一个无向图中找到所有桥(bridge)。桥是指在一个无向图中,如果去掉某条边,图中的连通分量数量会增加的边。 在Java中解决这个问题,我们可以使用Tarjan算法来寻找图中的桥。以下是一个Java实现的示例代码: ```java import java.util.*; public class Main { static int time; static List<Integer>[] adj; static int[] disc; static int[] low; static boolean[] visited; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); adj = new ArrayList[n + 1]; for (int i = 1; i <= n; i++) { adj[i] = new ArrayList<>(); } for (int i = 0; i < m; i++) { int u = scanner.nextInt(); int v = scanner.nextInt(); adj[u].add(v); adj[v].add(u); } disc = new int[n + 1]; low = new int[n + 1]; visited = new boolean[n + 1]; time = 0; for (int i = 1; i <= n; i++) { if (!visited[i]) { dfs(i, -1); } } // Print the bridges for (int i = 1; i <= n; i++) { for (int j : adj[i]) { if (j > i) { if (low[i] > disc[j] || low[j] > disc[i]) { System.out.println(i + " " + j); } } } } } static void dfs(int u, int parent) { visited[u] = true; disc[u] = low[u] = ++time; for (int v : adj[u]) { if (v == parent) continue; if (!visited[v]) { dfs(v, u); low[u] = Math.min(low[u], low[v]); } else { low[u] = Math.min(low[u], disc[v]); } } } } ``` 这段代码的主要思路是: 1. 使用邻接表存储图。 2. 使用Tarjan算法遍历图,并计算每个节点的发现时间(disc)和最低可达发现时间(low)。 3. 通过比较发现时间和最低可达发现时间来判断是否为桥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值