[NOIP2003]神经网络
一道语文题
注意输入模块的兴奋度要加上兴奋阀值。
Problem
问题背景
人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。
对神经网络的研究一直是当今的热门方向,兰兰同学在自学了一本神经网络的入门书籍后,提出了一个简化模型,他希望你能帮助他用程序检验这个神经网络模型的实用性。
问题描述
在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子:
神经元(编号为 1)
图中,
神经元按一定的顺序排列,构成整个神经网络。在兰兰的模型之中,神经网络中的神经无分为几层;称为输入层、输出层,和若干个中间层。每层神经元只向下一层的神经元输出信息,只从上一层神经元接受信息。下图是一个简单的三层神经网络的例子。
兰兰规定,
公式中的
如此,在输入层神经元被激发之后,整个网络系统就在信息传输的推动下进行运作。
现在,给定一个神经网络,及当前输入层神经元的状态(
输入格式
输入文件第一行是两个整数
接下来
再下面
输出格式
输出文件包含若干行,每行有两个整数,分别对应一个神经元的编号,及其最后的状态,两个整数间以空格分隔。
仅输出最后状态非零的输出层神经元状态,并且按照编号由小到大顺序输出!
若输出层的神经元最后状态均为NULL
。
输入
5 61 01 00 10 10 11 3 11 4 11 5 12 3 12 4 12 5 1
输出
3 14 15 1
Code
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;struct Node{ int c,u;}a[205];struct Edge{ int to,next,v;}e[40005];int h[205],cnt;bool vis[205];inline void Addedge(int x,int y,int v){ e[++cnt]=(Edge){y,h[x],v};h[x]=cnt;return;}queue<int>q;inline void bfs(){ int i,x,y; while(!q.empty()) { x=q.front();q.pop(); a[x].c-=a[x].u; if(a[x].c<0)continue; for(i=h[x];i;i=e[i].next) { y=e[i].to; a[y].c+=a[x].c*e[i].v; if(!vis[y]){vis[y]=true;q.push(y);} } } return;}int main(void){ int i,x,y,v,n,m; bool ans=false; scanf("%d%d",&n,&m); for(i=1;i<=n;++i) { scanf("%d%d",&a[i].c,&a[i].u); if(a[i].c) { vis[i]=true; a[i].c+=a[i].u; q.push(i); } } for(i=1;i<=m;++i) { scanf("%d%d%d",&x,&y,&v); Addedge(x,y,v); } bfs(); for(i=1;i<=n;++i) { if(!h[i]&&a[i].c>0) { ans=true; printf("%d %d\n",i,a[i].c); } } if(!ans)printf("NULL\n"); return 0;}