本篇教程由作者设定使用 CC BY-NC-SA 协议。

GTNH版本:2.2.0.0


本人第一次接触GT, 有误请指正

刚进入LV阶段最需要解决的就是乙烯的生产,考虑到后期经常要计算一些产出最大化,所以就有了这个

目标:

LV阶段单位原油产出乙烯最大化

分析:

原油 ->

  • 含硫炼油气 -> 炼油气

    • 轻蒸炼油气

    • 中蒸炼油气

    • 重蒸炼油气

  • 含硫石脑油 -> 石脑油

    • 轻蒸石脑油

    • 中蒸石脑油

    • 重蒸石脑油

  • 含硫轻燃油 -> 轻燃油

    • 轻蒸轻燃油

    • 中蒸轻燃油

    • 重蒸轻燃油

  • 含硫重燃油 -> 重燃油

    • 轻蒸重燃油

    • 中蒸重燃油

    • 重蒸重燃油

以此类推.... 最后分别由 轻蒸 中蒸 重蒸 轻氢 中氢 重氢 的产物产出 乙烯 暂时未考虑加氢的产物

:这是LV, 没裂化机

抽象一下就是一张有向无环图(DAG), 我们要求出根节点到某一节点的最长路径, 而边权就是原料与产物之间的比例

题目:

  • 现给出ki个节点, 求出ki1到ki2的最长路径

  • 输入:

    • n   //边数, 以下为每个边的入点 出点 边权

    • ki1 ki2 z    //两个节点 ki1 ki2 与边权 z

    • ........

由于数据量暂时比较小, 就没做数据初始化, 直接手动打了个表(有没有折叠列表啊, 这也太长了)

71

0 1 0.83

0 2 2.50

0 3 1.00

0 4 3.33

1 5 1.00

2 6 1.00

3 7 1.00

4 8 1.00

5 9 1.25

5 10 1.25

5 11 1.25

5 21 1.25

5 22 1.25

5 23 1.25

6 12 1.25

6 13 1.25

6 14 1.25

6 24 1.25

6 25 1.25

6 26 1.25

7 15 1.25

7 16 1.25

7 17 1.25

7 27 1.25

7 27 1.25

7 27 1.25

8 18 1.25

8 19 1.25

8 20 1.25

8 28 1.25

8 29 1.25

8 30 1.25

9 33 10.00

10 33 5.00

11 33 3.33

12 7 6.66

12 8 13.33

12 33 5.00

13 33 2.86

13 7 10.00

13 8 20.00

14 33 2.00

14 7 20.00

14 8 40.00

15 33 20.00

15 6 2.50

15 8 6.66

16 33 6.66

16 6 4.00

16 8 10.00

17 33 4.00

17 6 10.00

17 8 20.00

18 33 20.00

18 6 20.00

18 7 3.33

19 33 13.33

19 6 5.00

19 7 5.00

20 33 6.66

20 6 8.00

20 7 10.00

27 6 1.25

28 6 2.00

29 6 5.00

30 6 10.00

30 7 1.66

31 6 2.50

31 7 2.50

32 6 4.00

32 7 5.00


0原油


1含硫炼油气

2含硫石脑油

3含硫轻燃油

4含硫重燃油


5炼油气

6石脑油

7轻燃油

8重燃油


9轻蒸炼油气

10中蒸炼油气

11重蒸炼油气

12轻蒸石脑油

13中蒸石脑油

14重蒸石脑油

15轻蒸轻燃油

16中蒸轻燃油

17重蒸轻燃油

18轻蒸重燃油

19中蒸重燃油

20重蒸重燃油


21轻氢炼油气

22中氢炼油气

23重氢炼油气

24轻氢石脑油

25中氢石脑油

26重氢石脑油

27轻氢轻燃油

28中氢轻燃油

29重氢轻燃油

30轻氢重燃油

31中氢重燃油

32重氢重燃油


33乙烯


代码(基本只写了主体):  高情商:核心代码 低情商:懒得优化

#include<bits/stdc++.h>
using namespace std;
#define MAXA 100000

int n;
int step[MAXA], vis[MAXA];
double ans[MAXA];

//链式前向星;
int tot = 1;
int head[MAXA], ver[MAXA], next[MAXA];
double edge[MAXA];

void add(int x, int y, double z){
    ver[++tot] = y, edge[tot] = z;
    next[tot] = head[x], head[x] = tot;
};

void dfs(int x){
    vis[x] = 1;
    for (int i = head[x]; i; i = next[i]){
        int y = ver[i];
        double z = edge[i];
        if (ans[y] < ans[x] / z){
            //printf("%d的路径更新为%d到%d\n", y, x, y);
            ans[y] = ans[x] / z;
            step[y] = x;
            if (vis[y]){//只更新已走过的边, 优化; 
                dfs(y);
            }
        };
    };
};


int main(){
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i){
        int x, y;
        double z;
        scanf("%d %d %lf", &x, &y, &z);
        add(x, y, z);
    };
    
    ans[0] = 1;
    for (int x = 0; x < n; ++x){
        dfs(x);
    };
    //k为乙烯对应值; 
    for (int i = 33; i; i = step[i]){
        printf("%d <-- ", i);
    }
    printf("%d", 0);
    return 0;
};

输出为:

33 <-- 11 <-- 5 <-- 1 <-- 0

随缘更新