蒟蒻二十分求助
查看原帖
蒟蒻二十分求助
136889
wweiyi楼主2021/10/20 08:21

这道题目一看就是拓扑排序,但是我觉得可以用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;
}
2021/10/20 08:21
加载中...