本篇教程由作者设定使用 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
随缘更新