拓扑排序,求调。
#include<bits/stdc++.h>
using namespace std;
int n, m, c[110], u[110], f[110];
int inD[110], outD[110];
struct Edge
{
int v, w;
Edge(int v, int w) : v(v), w(w) {}
};
vector<Edge> adj[110];
void TopoSort()
{
queue<int> q;
for (int i = 1; i <= n; i++)
if (inD[i] == 0) q.push(i);
while (!q.empty())
{
int fr = q.front();
q.pop();
if (c[fr]) f[fr] = c[fr];
else
{
for (int i = 0; i < adj[fr].size(); i++)
if (f[adj[fr][i].v]) f[fr] += (adj[fr][i].w * f[adj[fr][i].v]);
f[fr] -= u[fr];
}
for (int i = 0; i < adj[fr].size(); i++)
if (--inD[adj[fr][i].v] == 0) q.push(adj[fr][i].v);
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> c[i] >> u[i];
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
inD[v]++, outD[u]++;
adj[u].push_back((Edge){v, w});
}
TopoSort();
bool flag = false;
for (int i = 1; i <= n; i++)
if (!outD[i] && f[i] > 0)
{
cout << i << " " << f[i] << endl;
flag = true;
}
if (!flag) cout << "NULL" << endl;
return 0;
}