拓扑排序
int in[MAXN];
void topsort(){
queue <int>que;
for(int i=1;i<=n;i++){
if(!in[i]) que.push(i);
}
while(!que.empty()){
int u = que.front();
que.pop();
for(int k=head[u];k;k=map[k].next){
int v = map[k].to;
int w = map[k].w;
in[v]--;
if(!in[v]){
que.push(v);
}
}
}
}
#include <stdio.h>
#include <queue>
#include <iostream>
using namespace std;
#define MAXN 100005
int n,m,ct;
int c[MAXN],U[MAXN];
int cnt;
int head[MAXN];
struct node{
int from,to,next,w;
}map[MAXN];
void add(int u,int v,int w){
map[++cnt] = (node){u,v,head[u],w};
head[u] = cnt;
}
int in[MAXN],out[MAXN];
void topsort(){
queue <int>que;
for(int i=1;i<=n;i++){
if(!in[i]) que.push(i);
}
while(!que.empty()){
int u = que.front();
que.pop();
for(int k=head[u];k;k=map[k].next){
int v = map[k].to;
int w = map[k].w;
c[v] += w*c[u];
in[v]--;
if(!in[v]){
que.push(v);
c[v] -= U[v];
if(c[v] <= 0) c[v] = 0;
}
}
}
}
int main(void)
{
cin >> n >> m;
for (int i=1;i<=n;i++){
int x,y;
cin >> x >> y;
c[i] = x;
U[i] = y;
}
for (int i=1;i<=m;i++){
int u,v,w;
cin >> u >> v >> w;
add(u,v,w);
in[v]++;
out[u]++;
}
topsort();
for(int i=1;i<=n;i++){
if(!out[i] && c[i]>0){
cout << i << " " << c[i] << endl;
ct = 1;
}
}
if(!ct) cout << "NULL";
return 0;
}
返回