先从入度为0的点开始,进行拓扑序列的计算,由于这个公式中的U(阈值)没有参与到乘法的部分,可以直接移项到左侧,进行计算就可以了,最后,输出出度为0的点的信息
代码
#include<bits/stdc++.h>
using namespace std;
const pair<int,int> PII;
const int maxn=50000+5;
const int inf=0x3f3f3f3f;
int n,m,tot,in[maxn],out[maxn],head[maxn],c[maxn];
struct edge
{
int to,nxt,v;
}e[maxn<<1];
void add(int x,int y,int z)
{
e[++tot].nxt=head[x];
head[x]=tot;
e[tot].to=y;
e[tot].v=z;
}
queue <int> que;
void toposort()
{
for(int i=1;i<n;i++)
if(!in[i]) que.push(i);
while(!que.empty())
{
int u=que.front();
que.pop();
for(int i=head[u];i;i=e[i].nxt)
{
int to=e[i].to;
--in[to];
if(c[u]>0) c[to]+=c[u]*e[i].v;
if(!in[to]) que.push(to);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int u,a,b,cc;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&c[i],&u);
if(!c[i]) c[i]-=u;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&cc);
add(a,b,cc);
in[b]++; out[a]++;
}
toposort(); int flag=0;
for(int i=1;i<=n;i++)
{
if(c[i]>0 && !out[i])
printf("%d %d\n",i,c[i]),flag=1;
}
if(!flag) printf("NULL");
return 0;
}