神经网络
链接:https://www.luogu.org/problemnew/show/1038
这道题目是一道比较简单的拓扑排序的题目,比较裸,注意一开始的初始化
if(ns[i].c > 0) {
ns[i].u = 0;
}
ns[i].c -= ns[i].u;
#include <cstdio>
#include <queue>
#include <cstring>
#define MAXN 110
#define MAXM 10010
using namespace std;
int n, p, x, y, z;
int cnt;
queue <int> q;
struct N {
int c, u, now, oute, ine;
} ns[MAXN];
struct E {
int from, to, pow, nxt;
} es[MAXM];
void addedge(int x, int y, int z) {
es[++cnt].from = x;
es[cnt].to = y;
es[cnt].pow = z;
es[cnt].nxt = ns[x].now;
ns[x].now = cnt;
}
int main() {
scanf("%d%d", &n, &p);
for(int i = 1; i <= n; i ++) {
scanf("%d%d", &ns[i].c, &ns[i].u);
if(ns[i].c > 0) {
ns[i].u = 0;
}
ns[i].c -= ns[i].u;
}
for(int i = 1; i <= p; i ++) {
scanf("%d%d%d", &x, &y, &z);
ns[x].oute ++;
ns[y].ine ++;
addedge(x, y, z);
}
for(int i = 1; i <= n; i ++) {
if(ns[i].ine == 0 && ns[i].c > 0) {
q.push(i);
}
}
while(!q.empty()) {
x = q.front();
q.pop();
for(int i = ns[x].now; i != 0; i = es[i].nxt) {
y = es[i].to;
ns[y].ine --;
if(ns[x].c > 0) ns[y].c += (es[i].pow * ns[x].c);
if(ns[y].ine == 0) {
q.push(y);
}
}
}
bool flag = true;
for(int i = 1; i <= n; i ++) {
if(ns[i].c > 0 && ns[i].oute == 0) {
printf("%d %d\n", i, ns[i].c);
flag = false;
}
}
if(flag) {
printf("NULL");
}
return 0;
}