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. IDEA-------破解方法

    ① 到这个地方下载 IntelliJ IDEA 注册码:http://idea.lanyus.com/  就是这个jar包:JetbrainsCrack-2.6.10-release-enc.jar ...

  2. Java-Mail邮件开发

    Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务. 几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要搞清楚电子邮件是如何在互 ...

  3. flask配置文件的几种方法

    配置文件的参数 flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: { 'DEBUG': get_debug_flag(default=False), 是 ...

  4. Java中如何设置表格处于不可编辑状态

    代码片段如下: 这样的话就可以将表格设置为不可编辑状态

  5. Jquery获取元素方法

    Jquery 获取元素的方法分为两种:jQuery选择器.jQuery遍历函数. 1.获取本身: a.只需要一种jQuery选择器 选择器 实例 说明 #Id $('#myId') ID选择器: 可以 ...

  6. 谈谈Java中的volatile(转载)

    内存可见性 留意复合类操作 解决num++操作的原子性问题 禁止指令重排序 总结 内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色.同synch ...

  7. ajax请求本地文件

    这是一个小随笔,真的很简短! 主要入坑点有两个 一.Chrome浏览器默认不支持ajax读取本地文件 解决:1.关闭所有Chrome网页 2.右击Chrome浏览器,打开“属性”     3.弹出属性 ...

  8. redis-cluster配置

    为什么要用redis-cluster 1.并发问题 redis官方生成可以达到 10万/每秒,每秒执行10万条命令假如业务需要每秒100万的命令执行呢? 2.数据量太大 一台服务器内存正常是16~25 ...

  9. Mac配置系统环境变量

    最近在配置flutter的环境变量,使用: export PATH=$PATH:`pwd`/flutter/bin 然后一段时间之后发现环境变量莫名其妙的就消失了,这里有一个大坑! !!!!Mac 系 ...

  10. Android : 跟我学Binder --- (2) AIDL分析及手动实现

    目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...