神经网络 - 题目 - Online Judge (haizeix.com)
做法:从拓扑排序的角度入手,用队列实现结点的遍历,在遍历的同时计算结点的状态值;用链式前向星存储有向边的信息;记录出度为0的结点为最后的输出结点。
代码:
/*************************************************************************
> File Name: 635.cpp
> Author: jby
> Mail:
> Created Time: Sun 16 Jul 2023 10:16:08 AM CST
************************************************************************/
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n, m;
struct edge {
int e, v, next;
} edge[10005];
int head[105], c[105], u[105], in_degree[105], out_degree[105];
int main() {
cin >> n >> m;
queue<int> que;
memset(head, -1, sizeof(head));
for (int i = 1; i <= n; i++) {
cin >> c[i] >> u[i];
if (c[i] != 0) {
que.push(i);
}
}
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
edge[i].e = b;
edge[i].v = c;
edge[i].next = head[a];
head[a] = i;
in_degree[b]++;
out_degree[a]++;
}
while (!que.empty()) {
int temp = que.front();
que.pop();
for (int i = head[temp]; i != -1; i = edge[i].next) {
int e = edge[i].e, v = edge[i].v;
if (c[temp] > 0) {
c[e] += c[temp] * v;
}
in_degree[e]--;
if (in_degree[e] == 0) {
que.push(e);
c[e] -= u[e];
}
}
}
int f = 0;
for (int i = 1; i <= n; i++) {
if (out_degree[i] == 0 && c[i] > 0) {
cout << i << " " << c[i] << endl;
f = 1;
}
}
if (f == 0) {
cout << "NULL" << endl;
}
return 0;
}