洛谷P1038 神经网络(bfs,模拟,拓扑)
题目背景
人工神经网络(Artificial Neural NetworkArtificialNeuralNetwork)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向,兰兰同学在自学了一本神经网络的入门书籍后,提出了一个简化模型,他希望你能帮助他用程序检验这个神经网络模型的实用性。
题目描述
在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子:
神经元〔编号为11)
图中,X_1-X_3X1−X3是信息输入渠道,Y_1-Y_2Y1−Y2是信息输出渠道,C_1C1表示神经元目前的状态,U_iUi是阈值,可视为神经元的一个内在参数。
神经元按一定的顺序排列,构成整个神经网络。在兰兰的模型之中,神经网络中的神经元分为几层;称为输入层、输出层,和若干个中间层。每层神经元只向下一层的神经元输出信息,只从上一层神经元接受信息。下图是一个简单的三层神经网络的例子。
兰兰规定,C_iCi服从公式:(其中nn是网络中所有神经元的数目)
C_i=\sum_{j,i \in E} W_{ji}C_{j}-U{i}Ci=∑j,i∈EWjiCj−Ui
公式中的W_{ji}Wji(可能为负值)表示连接jj号神经元和ii号神经元的边的权值。当 C_iCi大于00时,该神经元处于兴奋状态,否则就处于平静状态。当神经元处于兴奋状态时,下一秒它会向其他神经元传送信号,信号的强度为C_iCi。
如此.在输入层神经元被激发之后,整个网络系统就在信息传输的推动下进行运作。现在,给定一个神经网络,及当前输入层神经元的状态(C_iCi),要求你的程序运算出最后网络输出层的状态。
输入输出格式
输入格式:
输入文件第一行是两个整数n(1 \le n \le 100)n(1≤n≤100)和pp。接下来nn行,每行22个整数,第i+1i+1行是神经元ii最初状态和其阈值(U_iUi),非输入层的神经元开始时状态必然为00。再下面PP行,每行由22个整数i,ji,j及11个整数W_{ij}Wij,表示连接神经元i,ji,j的边权值为W_{ij}Wij。
输出格式:
输出文件包含若干行,每行有22个整数,分别对应一个神经元的编号,及其最后的状态,22个整数间以空格分隔。仅输出最后状态大于00的输出层神经元状态,并且按照编号由小到大顺序输出。
若输出层的神经元最后状态均为 00,则输出 “NULL”。
输入输出样例
5 6
1 0
1 0
0 1
0 1
0 1
1 3 1
1 4 1
1 5 1
2 3 1
2 4 1
2 5 1
3 1
4 1
5 1
题目类型:
模拟,BFS,拓扑排序
思路:
这道题主要模拟神经网络的传播,依次更新每一层的结点,类似于BFS。首先将通过vector数组v[i]记录第i个结点相连的后一层结点。然后先将第一层的点放入队列,之后每次从队列中取出一个点,更新与这个点相连的后一层的所有结点的C。由于点更新完成后要减去U,那么如何判断某个点将不再被更新了呢?这就需要用到拓扑排序的知识。初始时要记录每一个点的入度,用上一层的i结点更新下一次的j结点以后,j结点的入度就减1,但j结点的入度为0是,即代表j结点将不再会被更新,于是就可以减去U。一直更新队列,按层遍历完整个网络以后,最后一层的状态就随之得到了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
int to;//与哪个点相连
int w;//权重是多少
};
vector<node>vi[];//存i点与哪些点相连
queue<int>fir;
int ci[];
int ui[];
bool inq[];//标记在不在队列里
int in[];//记录入度
int main(){
int n,m;
cin>>n>>m;
while(!fir.empty()) fir.pop();
memset(inq,,sizeof(inq));
memset(in,,sizeof(in));
for(int i=;i<=n;i++)//输入ci和ui
{
cin>>ci[i]>>ui[i];
if(ci[i]!=)//如果是输入层
{
fir.push(i);//放到队列里
inq[i]=;//标记在队列中
}
}
for(int i=;i<=m;i++)//输入结点与结点相连的信息
{
int u,v,w;
cin>>u>>v>>w;
node no;
no.to=v;
no.w=w;
vi[u].push_back(no);//与u相连的结点又多了一个
in[v]++; //v结点入度+1
}
//fir队列里存放当前这一层,一层层遍历
//相当于来个bfs
while(!fir.empty())
{
int p = fir.front();
fir.pop();
inq[p]=; //标记不在队列里
for(int i=;i<vi[p].size();i++)//拿p.x这个点更新它的下层
{
node no = vi[p].at(i);
int to = no.to;//to表示与p.x相连的其中一个点
in[to]--;//to的入度-1
if(in[to]==)//如果这个点没有入度了,说明已经计算完了ci*wi,要减去ui
{
ci[to]-=ui[to];
}
if(ci[p]>)//如果p.x这个点被激活了,那么就可以根据题目要求更新to的ci了
{
ci[to] += no.w*ci[p]; //先更新
if(inq[to]==)//如果不在队列里,再把它放到队列里去,并更新lay
{
inq[to]=;//标记在队列里
fir.push(to);
}
}
} }
//找没有出度的点,输出它的值即可
bool f = ;//是不是没有输出
for(int i=;i<=n;i++)
{
if(vi[i].size()==)//找到输出层
{
if(ci[i]>)
{
f=;//有输出
cout<<i<<" "<<ci[i]<<endl;
}
}
}
if(!f){
cout<<"NULL"<<endl;
}
return ;
}
洛谷P1038 神经网络(bfs,模拟,拓扑)的更多相关文章
- 洛谷P1038 神经网络
P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...
- 洛谷P1038 神经网络==codevs1088 神经网络
P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...
- 洛谷——P1038 神经网络
P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...
- 洛谷 P1038 神经网络 Label:拓扑排序 && 坑 60分待查
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- [NOIP2003] 提高组 洛谷P1038 神经网络
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- 洛谷P1038神经网络题解
题目 这个题不得不说是一道大坑题,为什么这么说呢,这题目不仅难懂,还非常适合那种被生物奥赛刷下来而来到信息奥赛的学生. 因此我们先分析一下题目的坑点. 1: 题目的图分为输入层,输出层,以及中间层. ...
- 洛谷P1038神经网络
传送门啦 一个拓扑排序的题,感觉题目好难懂... #include <iostream> #include <cstdio> #include <cstring> ...
- 洛谷 P1038 神经网络
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- 洛谷P1038 神经网络题解
注意如果是 \(if(c[i])\) 这条语句并没有说明c[i]不为负数,所以说最好老老实实的写 #include<cstdio> #define _ 0 using namespace ...
随机推荐
- scrapy安装问题记录
ubuntu小白一枚,由于对于ubuntu的不了解所以导致有的问题解决不了只能白痴的重装一遍. 总结一下问题: 1.pip安装自带scrapy版本过低官方不提供维护,卸载不完全导致重装最新版不成功 # ...
- Vue Baidu Map局部注册实现和地图绘点
需求:在vue项目中,实现用户选择地图绘点或者通过搜索关键字选点 <template> <div id="home"> <h2>首页地图< ...
- Vue中实现与后台的数据交换(vue-resource)
vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应.(但是目前它已经停止更新了) 1.在vue中安装vue-resource插件 打 ...
- java中,字符串类型的时间数据怎样转换成date类型。
将字符串类型的时间转换成date类型可以使用SimpleDateFormat来转换,具体方法如下:1.定义一个字符串类型的时间:2.创建一个SimpleDateFormat对象并设置格式:3.最后使用 ...
- Python学习之路并发编程--信号量、事件、队列及生产消费模型
1. 信号量 对于多进程来说,多个进程同时修改数据,就可能出现安全隐患,所以引入了锁,这一机制,但锁只能有一把来控制一个的开关,当你需要几把锁的时候,就可能用到信号量的概念.他是用了锁的原理,内置了一 ...
- Java基础知识学习思维导图
- socks5代理转http代理
Convert-Shadowsocks-into-an-HTTP-proxy apt-get install polipo service polipo stop polipo socksParent ...
- Spring mvc后台重定向页面,实际前端不跳转
1.ajax不支持重定向 ajax是不支持重定向的,因为ajax本身就是局部刷新,不重新加载页面的. 2.若后台出现需要重定向页面,可以设置唯一错误码 前端ajax公共调用后,凡是遇到这一类错误码,则 ...
- PTA2
一.题目:7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成“贰万叁仟壹百零捌”元.为了简化输出,用 ...
- 打印杨辉三角—Python
b=[] for i in range(0,9): c=[] for j in range(0,i): if j==0: c.append(b[i-1][j]) if j<=i-2:#执行完第一 ...