题解
2026-01-03 16:10:39
发布于:江苏
1阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int MAXN = 105;
struct Edge {
int to, weight;
};
int n, p;
int c[MAXN], u[MAXN];
vector<Edge> graph[MAXN]; // 邻接表
int in_degree[MAXN], out_degree[MAXN];
int main() {
cin >> n >> p;
// 初始化
for (int i = 1; i <= n; i++) {
cin >> c[i] >> u[i];
}
for (int i = 0; i < p; i++) {
int s, t, w;
cin >> s >> t >> w;
graph[s].push_back({t, w});
in_degree[t]++;
out_degree[s]++;
}
queue<int> q;
// 将所有初始活跃的神经元(输入层)入队
for (int i = 1; i <= n; i++) {
if (c[i] > 0) {
q.push(i);
}
}
// 拓扑排序 + 信号传播
while (!q.empty()) {
int cur = q.front();
q.pop();
// 向所有邻居传播信号
for (auto& e : graph[cur]) {
int nxt = e.to;
int w = e.weight;
c[nxt] += c[cur] * w; // 累加输入信号
in_degree[nxt]--; // 入度减一
// 当前节点的所有输入已收齐
if (in_degree[nxt] == 0) {
c[nxt] -= u[nxt]; // 减去阈值
if (c[nxt] > 0) { // 兴奋则入队
q.push(nxt);
}
}
}
}
// 收集输出层中兴奋的神经元
vector<int> outputs;
for (int i = 1; i <= n; i++) {
if (out_degree[i] == 0 && c[i] > 0) {
outputs.push_back(i);
}
}
// 输出结果
if (outputs.empty()) {
cout << "NULL" << endl;
} else {
sort(outputs.begin(), outputs.end()); // 按编号升序
for (int idx : outputs) {
cout << idx << " " << c[idx] << endl;
}
}
return 0;
}
这里空空如也







有帮助,赞一个