码迷,mamicode.com
首页 > 编程语言 > 详细

[2003提高组]神经网络-拓扑排序

时间:2020-06-21 20:28:16      阅读:480      评论:0      收藏:0      [点我收藏+]

标签:顺序   输出   href   ref   递推   https   拓扑   als   ret   

题目
初始时Ci可以事先减去Ui,注意入度为0(即起始点)不要减。然后由于这张图是一个有向无环图,所以我们可以使用拓扑排序。排序完了过后就按照排好的顺序套给出的公式递推就行啦。
代码:

#include <iostream>
#include <queue>

using namespace std;
const int N=110,M=2*N*N;
int head[N],nxt[M],to[M],val[M],cnt;
int c[N],u[N],din[N],dout[N],a[N];
int n,m;

void add(int u,int v,int w) {
	to[++cnt]=v;
	val[cnt]=w;
	nxt[cnt]=head[u];
	head[u]=cnt;
}

void topo() {   //拓扑排序
	int tot=0;
	queue<int> q;
	for(int i=1;i<=n;i++)
	  if(!din[i])
	    q.push(i);
	while(!q.empty()) {
		int t=q.front();
		q.pop();
		a[++tot]=t;
		for(int i=head[t];i;i=nxt[i]) {
			int y=to[i];
			if(--din[y]==0)
			  q.push(y);
		}
	}
}

void work() {
	for(int i=1;i<=n;i++) {
		int x=a[i];
		if(c[x]>0)  //若活跃
		  for(int i=head[x];i;i=nxt[i]) {   //推向后继结点
			  int y=to[i];
			  c[y]+=val[i]*c[x];
		  }
	}
}

int main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  cin>>c[i]>>u[i];
	while(m--) {
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
        //增加出入度
		din[v]++;
		dout[u]++;
	}
	for(int i=1;i<=n;i++)
	  if(din[i])
	    c[i]-=u[i]; //事先减去阈值
	topo();
	work();
	bool flag=false;
	for(int i=1;i<=n;i++)
	  if(dout[i]==0 and c[i]>0)
	    cout<<i<<‘ ‘<<c[i]<<endl,flag=true; //出度为0且C>0的输出
	if(!flag)   //特判
	  cout<<"NULL";
	return 0;
}

[2003提高组]神经网络-拓扑排序

标签:顺序   输出   href   ref   递推   https   拓扑   als   ret   

原文地址:https://www.cnblogs.com/wyc06/p/13173421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!