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 ;
}
 
 
 
 
 

来源

[提交][状态][Edit] [TestData]

3076: 神经网络(bfs和拓扑排序)的更多相关文章

  1. hdu1532 用BFS求拓扑排序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目给出一些点对之间的先后顺序,要求给出一个字典序最小的拓扑排列.对于拓扑排序的问题,我们有DF ...

  2. 图论相关知识(DFS、BFS、拓扑排序、最小代价生成树、最短路径)

    图的存储 假设是n点m边的图: 邻接矩阵:很简单,但是遍历图的时间复杂度和空间复杂度都为n^2,不适合数据量大的情况 邻接表:略微复杂一丢丢,空间复杂度n+m,遍历图的时间复杂度为m,适用情况更广 前 ...

  3. Luogu2164 SHOI2007 交通网络 期望、BFS、拓扑排序

    传送门 题目还算不难吧 首先我们枚举点$i$,将其他所有点到这个点的最短路求出来 然后我们在这一次建出的最短路$DAG$的反图上进行拓扑排序.假设我们算到了点$j$,点$j$的人流量为$t_j$,点$ ...

  4. leetcode_课程表(BFS、拓扑排序)

    题目描述: 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 .在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹 ...

  5. (番外)使用DFS和BFS实现拓扑排序

    1.BFS实现 public class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { int[ ...

  6. HDU 4857 (反向拓扑排序 + 优先队列)

    题意:有N个人,M个优先级a,b表示a优先于b.而且每一个人有个编号的优先级.输出顺序. 思路来自:与PKU3687一样 在主要的拓扑排序的基础上又添加了一个要求:编号最小的节点要尽量排在前面:在满足 ...

  7. [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10161   Accepted: 2810 D ...

  8. 拓扑排序 Topological Sort

    2018-05-02 16:26:07 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中都在v前.例如,图形的顶点可以表示要执行的任 ...

  9. 拓扑排序详解(梅开二度之dfs版按字典序输出拓扑路径+dfs版输出全部拓扑路径

    什么是拓扑排序? 先穿袜子再穿鞋,先当孙子再当爷.这就是拓扑排序! 拓扑排序说白了其实不太算是一种排序算法,但又像是一种排序(我是不是说了个废话qwq) 他其实是一个有向无环图(DAG, Direct ...

随机推荐

  1. oracle中 trunc 处理日期的用法

    方法/步骤   1 select trunc(sysdate) from dual  结果是 截止到当日 不设置,默认是截止到”日“ 2 select trunc(sysdate,'year') fr ...

  2. teamview修改id

     怎么修改 TeamViewer ID 呢?按照下列的操作步骤,就能很简单的改变TeamViewer的id哦!1. 开始 > 运行,录入%appdata%,删除TeamViewer的文件夹: ...

  3. Tensorflow实战系列之一:《Tensorflow实现自己的图像分类》

    最近做GAN的实验,刚好有一批二分类的数据集,心血来潮想着也来试一下Tensorflow的实验.并且会尝试些不同网络的效果,重点在于动手尝试,加油~~ 首先介绍下我的数据集,简单的男性和女性,分别存在 ...

  4. delete 与 delete []

    /* Module: delete与delete[]的区别.cpp Notices: Copyright (c) 2017 Landy Tan */ #include <iostream> ...

  5. 模仿select下拉列表

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  6. java面向对象编程(四)--类变量、类方法

    1.什么是类变量? 类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. 如何定义类变量? 定义语法:     ...

  7. vscode 插件推荐 - 献给所有前端工程师(更新与2018.8.1)

    VScode现在已经越来越完善.性能远超Atom和webstorm,你有什么理由不用它?在这里,我会给你们推荐很多实用的插件,让你对 vscode 有更深刻的体会,渐渐地你就会知道它有多好用. 走马观 ...

  8. 清楚理解const_cast类型转换

    1.任何使用原常量的地方, 已经直接编码到代码中去了.故后续转换类型并不能改变原定义 2.const_cast转换, 是使用了新指针或者引用,指向了原定义的内存,故而可以修改该内存. 使用也得用新指针 ...

  9. kettle在本地执行向远程hdfs执行转换错误"Couldn't open file hdfs"

    kettle在本地执行向远程hdfs执行转换时,会出现以下错误: ToHDFS.0 - ERROR (version 7.1.0.0-12, build 1 from 2017-05-16 17.18 ...

  10. Bootstrap如何禁止响应式布局 不适配

    Bootstrap 会自动帮你针对不同的屏幕尺寸调整你的页面,使其在各个尺寸的屏幕上表现良好.下面我们列出了如何禁用这一特性,就像这个非响应式布局实例页面一样. 禁止响应式布局有如下几步: 移除 此 ...