题目
题解
拓扑排序
code
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// o o ooooo o o ooooo oooooooo ooooooo //
// oo oo o o o o o o o o //
// o o o o o o o o o o o o //
// o o o o o o o o o oooooooo o //
// o o o o o o o o o o ooooooo //
// o o o o o o o o o o o //
// o o o o o o o o o o o //
// o oo o o o o o o o o //
// o o o ooooo oooooooooo oooooooooo ooooo o ooooooo //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <list>
#include <map>
#include <iomanip>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define up(i, a, b) for (i = a; i <= b; ++i)
#define down(i, a, b) for (i = a; i >= b; --i)
typedef long long ull;
const int maxn = 1e6 + 1000;
const int inf = 0x3f3f3f3f;
using namespace std;
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); }
while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
return s * w;
}
int n;
int p;
int cnt = 0;
int c[maxn];
int u[maxn];
int in[maxn];
int out[maxn];
int link[maxn];
bool vis[maxn];
bool flag = false;
struct edge { int next, to, dis; } e[maxn];
inline void add(int from, int to, int dis) {
e[++cnt].to = to;
e[cnt].dis = dis;
e[cnt].next = link[from];
link[from] = cnt;
}
int main() {
n = read(), p = read();
// printf("%d^%d\n", n, p);
for (int i = 1; i <= n; ++i) {
c[i] = read(), u[i] = read();
if (c[i] > 0) u[i] = -1;
// printf("=%d %d=\n", c[i], u[i]);
}
for (int i = 1, x, y, z; i <= p; ++i) {
x = read(), y = read(), z = read();
add(x, y, z);
// cout << x << y << z;
++in[y];
++out[x];
}
for (int t = 1; t <= n; ++t) {
for (int i = 1; i <= n; ++i) {
if (in[i] == 0 && vis[i] == false) {
vis[i] = true;
// printf("%d %d===\n", c[i], u[i]);
if (u[i] != -1) c[i] -= u[i];
// printf("%d[]\n", link[i]);
for (int j = link[i]; j > 0; j = e[j].next) {
int v = e[j].to;
// printf("()%d\n", j);
if (c[i] > 0) {
c[v] += c[i] * e[j].dis;
// printf("%d %d %d\n", c[v], c[i], e[j].dis);
}
in[v]--;
}
break;
}
}
}
for (int i = 1; i <= n; ++i) {
if (out[i] == 0 && c[i] > 0) {
flag = true;
break;
}
}
if (flag) {
for (int i = 1; i <= n; ++i) {
if (out[i] == 0 && c[i] > 0) {
printf("%d %d\n", i, c[i]);
}
}
}
else printf("NULL\n");
return 0;
}