洛谷—P1038 神经网络(拓扑排序)

题目链接

题目意思比较明确,就是简单的拓扑排序,这里写几个图操作需要注意的坑点。

这里的边权值可能为正、负数,还可能为0,所以判断两个点之间是否有路径时要注意。

#include<bits/stdc++.h>
using namespace std;
int ui[110],ci[110],wi[110][110],n,p,inedge[110];
bool isconect[110][110];
vector<int> v;
queue<int> q;
int main()
{
	cin>>n>>p;
	for(int i=1;i<=n;++i)
	{
		cin>>ci[i]>>ui[i];
		if(ci[i]) ui[i]=0;
	}
	for(int i=1;i<=p;++i)
	{
		int x,y;
		cin>>x>>y;
		cin>>wi[x][y];
		isconect[x][y]=true;
		++inedge[y];
	}
	for(int i=1;i<=n;++i)
	{
		if(ci[i])
		q.push(i);
	}
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		ci[now]-=ui[now];
		int flag=0;
		for(int i=1;i<=n;++i)
		{
			if(isconect[now][i])
			{
				if(ci[now]>0)  ci[i]+=ci[now]*wi[now][i];
				--inedge[i];
				if(!inedge[i]) q.push(i);
				flag=1;
			}
		}
		if(!flag) v.push_back(now);
	}
	int flag=0;
	for(auto c:v)
	{
		if(ci[c]>0)
		{
			cout<<c<<' '<<ci[c]<<endl;
			flag=1;
		}
	}
	if(!flag)  cout<<"NULL"<<endl;
	return 0;
}
发布了165 篇原创文章 · 获赞 11 · 访问量 4887

猜你喜欢

转载自blog.csdn.net/weixin_43784305/article/details/104486956
今日推荐