这道题目一看就是拓扑排序,但是我觉得可以用dfs做
然后我就建了一个反图,从入度为0的点开始dfs,用类似于统计子树节点数量的方法来累加状态的值,但是不知道怎么回事,只能得到第四个数据点的分数,请问各位大神是怎么回事,若能回答,蒟蒻不胜感激
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#define int long long
using namespace std;
const int maxn=105;
struct edge{
int e,next,val;
}ed[maxn*maxn];
int en,first[maxn];
void add_edge(int s,int e,int val)
{
en++;
ed[en].next=first[s];
first[s]=en;
ed[en].e=e;
ed[en].val=val;
}
int n,p;
int C[maxn],U[maxn];
int in[maxn];
int st[maxn];
void dfs(int x)
{
st[x]=C[x]-U[x];
for(int i=first[x];i;i=ed[i].next)
{
int e=ed[i].e;
int val=ed[i].val;
dfs(e);
if(st[e]>0)
st[x]+=(val*C[e]);
}
return ;
}
signed main()
{
cin>>n>>p;
for(int i=1;i<=n;i++)
cin>>C[i]>>U[i];
for(int i=1;i<=p;i++)
{
int x,y,z;
cin>>x>>y>>z;
add_edge(y,x,z);
in[x]++;
}
for(int i=1;i<=n;i++)
if(!in[i])
dfs(i);
bool flag=false;
for(int i=1;i<=n;i++)
{
if(st[i]>0&&in[i]==0)
{
flag=true;
cout<<i<<" "<<st[i]<<'\n';
}
}
if(!flag)
cout<<"NULL"<<'\n';
return 0;
}