40pts,WA#1#2#3
查看原帖
40pts,WA#1#2#3
548203
KK_lang楼主2023/1/13 19:25

拓扑排序,求调。

#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;
}
2023/1/13 19:25
加载中...