3076: 神经网络(bfs和拓扑排序)
3076: 神经网络
时间限制: 1 Sec 内存限制: 125 MB
提交: 7 解决: 5
[提交][状态][讨论版][命题人:外部导入][Edit] [TestData] [同步数据]
题目描述
人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向,兰兰同学在自学了一本神经网络的入门书籍后,提出了一个简化模型,他希望你能帮助他用程序检验这个神经网络模型的实用性。
在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经
元之间至多有一条边相连,下图是一个神经元的例子:
图中,X1—X3是信息输入渠道,Y1—Y2是信息输出渠道,C1表示神经元目前的状态,Ui是阈值,可视为神经元的一个内在参数。
神经元按一定的顺序排列,构成整个神经网络。在兰兰的模型之中,神经网络中的神经无分为几层;称为输入层、输出层,和若干个中间层。每层神经元只向下一层的神经元输出信息,只从上一层神经元接受信息。下图是一个简单的三层神经网络的例子。
兰兰规定,Ci服从公式:(其中n是网络中所有神经元的数目)
公式中的Wji(可能为负值)表示连接j号神经元和 i号神经元的边的权值。当 Ci大于0时,该神经元处于兴奋状态,否则就处于平静状态。当神经元处于兴奋状态时,下一秒它会向其他神经元传送信号,信号的强度为Ci。
如此,在输入层神经元被激发之后,整个网络系统就在信息传输的推动下进行运作。
现在,给定一个神经网络,及当前输入层神经元的状态(Ci),要求你的程序运算出最后网络输出层的状态。
输入
每组输入第一行是两个整数n(1≤n≤20)和p。接下来n行,每行两个整数,第i+1行是神经元i最初状态和其阈值(Ui),非输入层的神经元开始时状态必然为0。再下面P行,每行由两个整数i,j及一个整数Wij,表示连接神经元i、j的边权值为Wij。
输出
若输出层的神经元最后状态均为 0,则输出 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
提示
- #include<iostream>
- #include<cmath>
- #include<cstdio>
- #include<cstring>
- #include<string>
- #include<algorithm>
- #include<map>
- #include<queue>
- #include<vector>
- #define ll long long
- using namespace std;
- struct node{
- int to;
- int w;
- };
- struct point{//队列里放的东西,x代表第几个点,lay表示第几层
- int x;
- int lay;
- };
- vector<node>vi[];//存i点与哪些点相连
- queue<point>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++)
- {
- cin>>ci[i]>>ui[i];
- if(ci[i]!=)
- {
- point p;
- p.lay=;
- p.x=i;
- fir.push(p);
- 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);
- in[v]++;
- }
- //fir队列里存放当前这一层,一层层遍历
- //相当于来个bfs
- while(!fir.empty())
- {
- point p = fir.front();
- fir.pop();
- inq[p.x]=; //标记不在队列里
- //cout<<"取出"<<p.x<<endl;
- //cout<<"ci"<<ci[p.x]<<endl;
- //拿p.x这个点更新与它相连的边
- for(int i=;i<vi[p.x].size();i++)
- {
- //消去与它相邻的边
- node no = vi[p.x].at(i);
- int to = no.to;
- in[to]--;
- //cout<<"相邻边"<<to<<endl;
- if(in[to]==)//如果这个点没有入度了,说明已经计算完了ci*wi,要减去ui
- {
- ci[to]-=ui[to];
- }
- if(ci[p.x]>)
- {
- //先更新
- ci[to] += no.w*ci[p.x];
- //cout<<"更新"<<to<<" "<<ci[to]<<endl;
- //再把它放到队列里去,并更新lay
- if(inq[to]==)
- {//如果不在队列里,就把它放进去
- point p2;
- p2.x = to;
- p2.lay = p.lay+;//层数在这个点的基础上+1
- inq[to]=;//标记在队列里
- fir.push(p2);
- }
- }
- }
- }
- //找没有出度的点,输出它的值即可
- 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;
- }
- //for(int i=6;i<=7;i++){
- // cout<<"ci[i]"<<" "<<i<<" "<<ci[i]<<endl;
- //}
- return ;
- }
来源
3076: 神经网络(bfs和拓扑排序)的更多相关文章
- hdu1532 用BFS求拓扑排序
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目给出一些点对之间的先后顺序,要求给出一个字典序最小的拓扑排列.对于拓扑排序的问题,我们有DF ...
- 图论相关知识(DFS、BFS、拓扑排序、最小代价生成树、最短路径)
图的存储 假设是n点m边的图: 邻接矩阵:很简单,但是遍历图的时间复杂度和空间复杂度都为n^2,不适合数据量大的情况 邻接表:略微复杂一丢丢,空间复杂度n+m,遍历图的时间复杂度为m,适用情况更广 前 ...
- Luogu2164 SHOI2007 交通网络 期望、BFS、拓扑排序
传送门 题目还算不难吧 首先我们枚举点$i$,将其他所有点到这个点的最短路求出来 然后我们在这一次建出的最短路$DAG$的反图上进行拓扑排序.假设我们算到了点$j$,点$j$的人流量为$t_j$,点$ ...
- leetcode_课程表(BFS、拓扑排序)
题目描述: 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 .在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹 ...
- (番外)使用DFS和BFS实现拓扑排序
1.BFS实现 public class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { int[ ...
- HDU 4857 (反向拓扑排序 + 优先队列)
题意:有N个人,M个优先级a,b表示a优先于b.而且每一个人有个编号的优先级.输出顺序. 思路来自:与PKU3687一样 在主要的拓扑排序的基础上又添加了一个要求:编号最小的节点要尽量排在前面:在满足 ...
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10161 Accepted: 2810 D ...
- 拓扑排序 Topological Sort
2018-05-02 16:26:07 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中都在v前.例如,图形的顶点可以表示要执行的任 ...
- 拓扑排序详解(梅开二度之dfs版按字典序输出拓扑路径+dfs版输出全部拓扑路径
什么是拓扑排序? 先穿袜子再穿鞋,先当孙子再当爷.这就是拓扑排序! 拓扑排序说白了其实不太算是一种排序算法,但又像是一种排序(我是不是说了个废话qwq) 他其实是一个有向无环图(DAG, Direct ...
随机推荐
- 『TensorFlow』SSD源码学习_其七:损失函数
Fork版本项目地址:SSD 一.损失函数介绍 SSD损失函数分为两个部分:对应搜索框的位置loss(loc)和类别置信度loss(conf).(搜索框指网络生成的网格) 详细的说明如下: i指代搜索 ...
- pyqt小例子
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow imp ...
- redis的数据类型及使用
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- Python Flask之留言板(无数据库)
一个py文件,一个html文件,可以直接运行 py文件 from flask import Flask, request, render_template, redirect, url_for imp ...
- vim 插件 -- NERDTree
介绍 NERDTree 插件就是使vim编辑器有目录效果. 所谓无图无真相,所以直接看这个插件的效果图吧. 下载 https://www.vim.org/scripts/script.php?scri ...
- 跟随我在oracle学习php(7)
盒子模型布局 盒子模型:每个标签都是一个盒子 计算宽高:box-sizing:border-box盒子的宽度就是设置的宽度,里面的内容自适应 从里到外:padding(内边距) Border(边框) ...
- 树形结构表的存储【转自:http://www.cnblogs.com/huangfox/archive/2012/04/11/2442408.html】
在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系.在传统的关系型数据库中,就已经产生了各种解决方案. 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型 ...
- static静态全局变量和static静态局部变量
static静态全局变量: 静态全局变量就是将全局变量变成静态的.如何变?——全局变量加个static. static就是一个存储类说明符,a这个全局变量就成了一个静态全局变量了. 静态全局变量的特点 ...
- python常见错误
最近刚刚接触Python,为了养成好习惯,遇到了诸多的问题,林林总总,在这里简单记录下: 编写简单的python语句时: module level import not at top of file ...
- 获取Ueditor里面的图片列表,地址绝对化
/** * 内容中图片地址转成绝对地址 * @param $content * @return mixed */ private function imgUrl( ...