package com.example.demo.util;
import java.util.*;
/**
* 应用模块名称<p>
* 代码描述<p>
* Created by 002736 on 2021/3/23.
*
* @author 002736
* @version V1.0.0
* @since 2021/3/23 18:28
*/
public class Test {
static Side[] lu;
static int[] id;
static int n;
static int m;
static double[] ve;
static Stack s;
static Queue q;
static String[] name = {"开始","桌面开料","桌腿开料","抽屉板开料","抛光","打磨","抽屉组装","组装","油漆","抽屉油漆","全桌组装","结束"};
static List<Integer> nameNum=new ArrayList<>();
public static double hange(){
double []vl = new double[n];
for(int i = 0;i < n;i++){
vl[i] = ve[n-1];
}
while (!s.empty()){
int u = (int) s.pop();
for(int i=0;i < lu.length;i++){
if (lu[i].pre == u){
int n = lu[i].next;
if (vl[n]-lu[i].q < vl[u]){
vl[u]=vl[n]-lu[i].q;
}
}
}
}
for (int i = 0;i<n;i++){
for(int j=0;j<lu.length;j++){
if (lu[j].pre==i){
int v = lu[j].next;
double w = lu[j].q;
double e = ve[i];
double l = vl[v]-w;
if (e==l){
nameNum.add(i);
}
}
}
}
return ve[n-1];
}
//拓扑排序
public static boolean tuop(){
q= new LinkedList();
for(int i = 0;i< n;i++){
//入度为0的入队
if (id[i]==0){
((LinkedList) q).add(i);
}
}
while (!q.isEmpty()){
int u = (int) q.poll();
s.push(u);
for (int i = 0;i< lu.length;i++){
if (lu[i].pre == u){
int v = lu[i].next;
id[v]--;
if (id[v]==0){
q.add(v);
}
if (ve[u]+lu[i].q>ve[v]){
ve[v] = ve[u]+lu[i].q;
}
}
}
}
if (s.size() == n){
return true;
}else {
return false;
}
}
public static void main(String[] args){
//节点数
n = 12;
//边数
m = 13;
lu = new Side[13];
id = new int[n];
ve = new double[n];
s=new Stack();
lu[0] = new Side(0,1,0);
id[1]++;
lu[1] = new Side(0,2,0);
id[2]++;
lu[2] = new Side(0,3,0);
id[3]++;
lu[3] = new Side(1,4,0.5);
id[4]++;
lu[4] = new Side(2,5,0.5);
id[5]++;
lu[5] = new Side(3,6,1);
id[6]++;
lu[6] = new Side(4,7,0.5);
id[7]++;
lu[7] = new Side(5,7,1);
id[7]++;
lu[8] = new Side(6,9,1);
id[9]++;
lu[9] = new Side(7,8,0.5);
id[8]++;
lu[10] = new Side(8,10,0.5);
id[10]++;
lu[11] = new Side(9,10,2);
id[10]++;
lu[12] = new Side(10,11,1);
id[11]++;
if(tuop()){
double k=0;
for (int i=0;i<n;i++){
k = Math.max(k,ve[i]);
}
hange();
for (Integer integer :nameNum){
System.out.print(name[integer]+" , ");
}
System.out.println("Cost: "+k+" Hours");
}else{
System.out.println("0");
}
}
}
//边的定义
class Side{
//起点
int pre;
//终点
int next;
//花费时间
double q;
public Side(int pre,int next,double q){
super();
this.pre = pre;
this.next = next;
this.q = q;
}
}