洛谷P1038 神经网络题解

注意如果是

  • \(if(c[i])\)

这条语句并没有说明c[i]不为负数,所以说最好老老实实的写

#include<cstdio>
#define _ 0
using namespace std;
int c[105],u[105];
struct ben
{
	int i,j,w;
}a[10005];
int h[10005],in[105],out[105],vis[105];
int main()
{
	int n,p;
	scanf("%d%d",&n,&p);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&c[i],&u[i]);
		if(c[i]>0)u[i]=-1;
	}
	int cnt=0;
	for(int k=1;k<=p;k++)
	{
		int i,j,w;
		scanf("%d%d%d",&i,&j,&w);
		a[++cnt]=(ben){j,w,h[i]};//终点,权值,以及起点所对应的边记录的编号 
		h[i]=cnt;
		in[j]++;
		out[i]++;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(in[j]==0&&vis[j]==0)
			{
				vis[j]=1;
				if(u[j]!=-1)c[j]-=u[j];
				for(int k=h[j];k>0;k=a[k].w)
				{
					if(c[j]>0)
					{
						c[a[k].i]+=c[j]*a[k].j;
					}
					in[a[k].i]--;
				}
				break;
			}
		}
	}
	int flag=0;
	for(int i=1;i<=n;i++)
	{
		if(out[i]==0&&c[i]>0)
		{
			flag=1;
			break;
		}
	}
	if(flag==1)
	{
		for(int i=1;i<=n;i++)
		{
			if(out[i]==0&&c[i]>0)
			{
				printf("%d %d\n",i,c[i]);
			}
		}
	}
	else
	{
		printf("NULL\n");
	}
	return 0^_^0;
}
posted @ 2019-08-30 18:42  ShineEternal  阅读(179)  评论(0编辑  收藏  举报