HDU 4514 (无向图判断环及树的直径)

该问题描述了一种设计环形观光线路的需求,给出无向图的节点和边,要求判断能否形成环并求解最长路径。解决方法包括使用并查集判断环和通过BFS寻找树的直径。

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

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

Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 5018 Accepted Submission(s): 932

Problem Description
  随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好。
  现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度。请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?
  其中,可以兴建的路线均是双向的,他们之间的长度均大于0。

Input
  测试数据有多组,每组测试数据的第一行有两个数字n, m,其含义参见题目描述;
  接下去m行,每行3个数字u v w,分别代表这条线路的起点,终点和长度。

  [Technical Specification]
  1. n<=100000
  2. m <= 1000000
  3. 1<= u, v <= n
  4. w <= 1000

Output
  对于每组测试数据,如果能够建成环形(并不需要连接上去全部的风景点),那么输出YES,否则输出最长的长度,每组数据输出一行。

Sample Input
3 3
1 2 1
2 3 1
3 1 1

Sample Output
YES

  • 无向图的判环:并查集,若有一组边的两个端点的根是相同的,那么就形成了环。
  • 有向图的判环:1、拓扑排序,若失败则有环 2、floyd和spfa若得到自节点的权大于0则说明有环
  • 树的直径:及树中两个节点间最长距离。求法:先从任意节点i bfs一遍,找到到i的最大距离的节点,再从这个节点出发,找到到这个节点的最大距离的,即树的直径。(结论:设树的直径是st,则从树的任意节点出发,最远点必为s或t)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include &
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、付费专栏及课程。

余额充值