第一题(DFS)
题目:
物流公司每天都要处理很多物流的运输工作,整个城市共有 ( N ) 个地点,共有 ( N - 1 ) 条公路,每 2 个地点之间都能通过公路连通。物流公司总部位于 1 号地点。 今天有一辆物流运输车共有 ( M ) 条物流运输任务,物流运输车每天的工作流程如下: 先要从总部出发去收取所有的寄件货物,收到所有货物后回到总部扫描货物,再从总部出发将货物送至所有的送件地址,送完后最终回到总部,算作完成了今天的运输工作。 请问该辆物流运输车今天最少行驶多少路程可以完成今天的运输工作,运输任务不分先后。
对于每组数据,第一行有 2 个整数,表示有 ( N ) 个地点和 ( M ) 条物流任务,数字用空格分开。 接下来有 ( N - 1 ) 行,每行有 3 个整数表示从 ( u ) 到 ( v ) 有一条公路,公路里程为 ( c ),输入保证所有地点连通。 接下来有 ( M ) 行,每行有 2 个整数,表示寄件任务从 ( s ) 寄到 ( t )。
输出一个整数,表示该辆物流运输车最少行驶多少路程能够完成今天的运输工作。
4 2 10
2 1 1
1 3 2
4 3 2
3 2
4 2
5 2 24
2 1 1
1 3 2
4 3 2
1 5 3
4 2
5 4
参考代码:
import java.util.*;
import java.io.*;
public class Main {
static class Edge {
int v, w;
Edge(int v, int w) {
this.v = v;
this.w = w;
}
}
static List<List<Edge>> adj;
static boolean[] isSource, isDest;
static long sourceSum, destSum;
//如果当前节点是取件点,或者它某个子节点返回了 true(说明子树中有取件点),就说明这条边必须被计入路径中。
static boolean dfsSource(int u, int parent) {
boolean hasSource = isSource[u];
for (Edge e : adj.get(u)) {
if (e.v == parent) continue;
if (dfsSource(e.v, u)) {
sourceSum += e.w;
hasSource = true;
}
}
return hasSource;
}
static boolean dfsDest(int u, int parent) {
boolean hasDest = isDest[u];
for (Edge e : adj.get(u)) {
if (e.v == parent) continue;
if (dfsDest(e.v, u)) {
destSum += e.w;
hasDest = true;
}
}