当前位置:网站首页>关键路径实现
关键路径实现
2022-07-22 06:24:00 【chengqiuming】
一 拓扑图
二 代码
package graph.criticalPath;
import java.util.Scanner;
import java.util.Stack;
public class CriticalPath {
static final int maxn = 10010;
static final int maxe = 50010;
static int n;
static int m;
static int cnt;
static int head[] = new int[maxn]; // 链式前向星头
static int in[] = new int[maxn]; // 入度
static int topo[] = new int[maxn]; //拓扑序列
static int ve[] = new int[maxn]; // 事件vi的最早发生时间
static int vl[] = new int[maxn]; // 事件vi的最迟发生时间
static Stack<Integer> s = new Stack<>();
static node[] e = new node[maxe];
static {
for (int i = 0; i < e.length; i++) {
e[i] = new node();
}
}
static void add(int u, int v, int w) {
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
e[cnt++].w = w;
}
// 拓扑排序
static boolean TopoSort() {
int cnt = 0;
for (int i = 0; i < n; i++)
if (in[i] == 0)
s.push(i);
while (!s.empty()) {
int u = s.peek();
s.pop();
topo[cnt++] = u;
for (int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].to;
if (--in[v] == 0)
s.push(v);
}
}
if (cnt < n) return false; // 该有向图有回路
return true;
}
static boolean CriticalPath() { // 关键路径
if (TopoSort()) {
System.out.println("拓扑序列为:");
for (int i = 0; i < n; i++) // 输出拓扑序列
System.out.print(topo[i] + "\t");
System.out.println();
} else {
System.out.println("该图有环,无拓扑序列!");
return false;
}
for (int i = 0; i < n; i++) // 初始化最早发生时间为0
ve[i] = 0;
// 按拓扑次序求每个事件的最早发生时间
for (int j = 0; j < n; j++) {
int u = topo[j]; // 取得拓扑序列中的顶点
for (int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].to, w = e[i].w;
if (ve[v] < ve[u] + w)
ve[v] = ve[u] + w;
}
}
for (int i = 0; i < n; i++) //初始化每个事件的最迟发生时间为ve[n]
vl[i] = ve[n - 1];
for (int j = n - 1; j >= 0; j--) {//按逆拓扑序求每个事件的最迟发生时间
int u = topo[j]; //取得拓扑序列中的顶点
for (int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].to, w = e[i].w;
if (vl[u] > vl[v] - w)
vl[u] = vl[v] - w;
}
}
System.out.println("事件的最早发生时间和最迟发生时间:");
for (int i = 0; i < n; i++)
System.out.println(ve[i] + "\t" + vl[i]);
System.out.println("关键活动路径为:");
for (int u = 0; u < n; u++) { //每次循环针对vi为活动开始点的所有活动
for (int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].to, w = e[i].w;
int e = ve[u]; // 计算活动<vi, vj>的最早开始时间e
int l = vl[v] - w; // 计算活动<vi, vj>的最迟开始时间l
if (e == l) // 若为关键活动,则输出<vi, vj>
System.out.println("<" + u + "," + v + ">");
}
}
return true;
}
public static void main(String[] args) {
int u, v, w;
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
for (int i = 0; i < head.length; i++) {
head[i] = -1;
}
for (int i = 0; i < m; i++) {
u = scanner.nextInt();
v = scanner.nextInt();
w = scanner.nextInt();
add(u, v, w);
in[v]++;
}
CriticalPath();
}
}
class node {
int to;
int w;
int next;
}
三 测试
边栏推荐
- PostgreSQL判断是否为空coalesce
- Pytorch deep learning practice-b station Liu erden-day2
- 浅谈不可转让的声誉积分NFT SBTs面临的困境
- [C language interesting experiment]
- Infrared remote control of FPGA
- An annotation implementation method writes the returned data to the cache (facet, redis Implementation)
- 1312. Minimum number of inserts to make a string a palindrome string
- DP子序列系列问题
- 有人知道oracle cdc这个问题吗?source没有空值,但是查询定义的cdc表时说有空值,让修
- 以CRM系统为案例讲解数据分析(重要性介绍及分析方法)
猜你喜欢
随机推荐
Unity postprocess screen post-processing
Infrared remote control of FPGA
Sparse array (sparse)
Pytorch deep learning practice-b station Liu erden-day1
Cans (kuangbin topic)
浅谈不可转让的声誉积分NFT SBTs面临的困境
【C语言趣味实验】
Win11闪白屏无法控制如何解决?
重装Win11系统如何在线一键进行?
Reading papers [6] autoassembly: learning augmentation strategies from data
分支语句和循环语句
ABAQUS realizes modal calculation of two degree of freedom vibration system
This competition is a bit against the sky! Kunpeng application innovation competition openeuler track is fully opened
Default constraint of MySQL constraint default
NFS network file system
Implementation of MATLAB mixer
flinksql 的task可以监控是否中断吗?
会议OA项目
【LeetCode】814. 二叉树剪枝
mysql约束之_唯一约束