题目

因此我们先分析一下题目的坑点。

1:

题目的图分为输入层,输出层,以及中间层。

我们怎么判断呢???可以判断每个点的入度及出度。如果一个点的入度为零则它是输入层,出度为零则是输出层。其余情况便是中间层。

因为根据原题所描述的

公式中的 Wji​ (可能为负值)表示连接 j 号神经元和 i 号神经元的边的权值。

当 C_i 大于 0 时,该神经元处于兴奋状态,否则就处于平静状态。当神经元处于兴奋状态时,下一秒它会向其他神经元传送信号,信号的强度为 C_i​。

我们可以得出只有一个点是终点时,才会满足上述公式,或者说是(非输入层),因此我们可以想到如果想让一个中间层或输出层的状态确定,那么与他相连的边的Cj值都要乘上,如果有一条不乘上,就不满足。

很容易想到现在所有的Cj的值必须是已经算出来的了。

因此我们可以想到拓扑排序,因为拓扑排序的条件就是这个点与他相连的边的起点都要先完成他们的任务。

2:

根据上文所知,C值一开始是不确定的,所以我们可以新建一个now数组,来表示现在这个点的状态值,当他相连边的起点都加到now的值上时,即入度为0,那此时的now值就是他的状态值。

但是这里有一个大坑点:只有这条边的起点的C值>0时才可以加上。

并且你不能在刚取出这个起点的时候就判断(别问我怎么知道的)。

因为如果你判断了,那终点的入度就减不了了。

用拓扑排序的套路,把这个点入队。再反复进行上面的几步。

分析完这个题的坑点,基本上这个题就解决了。

代码:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
queue<int>q;
int n,m,in_degree[],out_degree[];
bool flag;
int tot,lin[];
int c[],u[],now[];//now是现在的状态值,并不是最终的。
struct cym {
int from,to,next,len;
} e[];
void add(int x,int y,int v)
{
e[++tot].from=x;
e[tot].to=y;
e[tot].len=v;
e[tot].next=lin[x];
lin[x]=tot;
in_degree[y]++;//判断是否是输出层和输入层及拓扑排序
out_degree[x]++;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
scanf("%d%d",&c[i],&u[i]);
for(int i=; i<=m; i++) {
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
add(x,y,v);
}
for(int i=; i<=n; i++)
if(!in_degree[i])//如果这个点是输入层他的状态是最先确定的,因此根据FIFO原则,用队列优化,也是拓扑排序的方法。
q.push(i);
while(!q.empty()) {
int cur=q.front();
q.pop();
//if(c[cur]<=0)加上这两句是不行的,因为要减去下文的入度
//continue;
for(int i=lin[cur]; i; i=e[i].next)
{
in_degree[e[i].to]--;
if(c[e[i].from]>)//判断该点是否可以向下传递
now[e[i].to]+=c[e[i].from]*e[i].len;
if(!in_degree[e[i].to])//当入度为零时说明所有先决条件都已满足,满足拓扑排序,可以入队
{
now[e[i].to]-=u[e[i].to];//别忘了减去阈值
c[e[i].to]=now[e[i].to];
q.push(e[i].to);
}
}
}
for(int i=; i<=n; i++)
if(out_degree[i]==&&c[i]>)//判断是否为输出层且最后状态>0
{
flag=;
printf("%d %d\n",i,c[i]);
}
if(!flag)
printf("NULL");
}

洛谷P1038神经网络题解的更多相关文章

  1. 洛谷P1038 神经网络题解

    注意如果是 \(if(c[i])\) 这条语句并没有说明c[i]不为负数,所以说最好老老实实的写 #include<cstdio> #define _ 0 using namespace ...

  2. 洛谷P1038 神经网络==codevs1088 神经网络

    P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...

  3. 洛谷P1038 神经网络

    P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...

  4. 洛谷——P1038 神经网络

    P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...

  5. 洛谷 P1038 神经网络 Label:拓扑排序 && 坑 60分待查

    题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...

  6. 洛谷P1038 神经网络(bfs,模拟,拓扑)

    题目背景 人工神经网络(Artificial Neural NetworkArtificialNeuralNetwork)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸 ...

  7. 洛谷 P1038 神经网络

    题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...

  8. [NOIP2003] 提高组 洛谷P1038 神经网络

    题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...

  9. 洛谷P1038神经网络

    传送门啦 一个拓扑排序的题,感觉题目好难懂... #include <iostream> #include <cstdio> #include <cstring> ...

随机推荐

  1. Python-模块导入-63

    模块导入: # 内置模块 # 扩展的 django # 自定义的 # 文件 # import demo # def read(): # print('my read func') # demo.rea ...

  2. SoftWater——SDN+UnderWater系列论文一

    ---- SoftWater: Software-defined networking for next-generation underwater communication systems 来源: ...

  3. AQS解析(未完成)

    参考:Java并发之AQS详解 同步队列和condition等待队列.获取到锁的线程则处于可运行状态,而未获取到锁的线程则被添加到同步队列中,等待获取到锁的线程释放锁. 一.数据结构 Node sta ...

  4. React-Native windows环境搭建记录

    1.安装jdk,SDK Jdk下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-213315 ...

  5. 5 Http请求中文乱码处理

    java 乱码分很多种,这里主要研究解决http请求中出现乱码的情况. http请求出现中文乱码的主要原因:发送方与接收方编码不一致,服务器默认支持的编码与web应用不一致,如:tomcat 是国外程 ...

  6. C++多态(静多态和动多态)

    如今的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式(object-oriented ...

  7. Struts2——namespace、action、以及path问题

    简单的介绍下Struts2中的几个简单的问题(namespace.action.以及path问题) namespace(命名空间) Namespace决定了action的访问路径,默认为“”,意味着可 ...

  8. 排查 Maxwell can not find database 并且使用 MySQL binlog 解决相关问题

    目前我们在使用 Maxwell 在读线上机器的 binlog 同步我们的离线数据库. 这次错误定位上,首先线要确定问题是发生在生产者 还是队列 还是消费者.经过查看各机器上任务的运行日志,定位到了问题 ...

  9. Java并发编程之ThreadGroup

    ThreadGroup是Java提供的一种对线程进行分组管理的手段,可以对所有线程以组为单位进行操作,如设置优先级.守护线程等. 线程组也有父子的概念,如下图: 线程组的创建 public class ...

  10. python数学第五天【常用概率分布】

    1. 概率基本公式 思考题: 3. 两点分布 4. 二项分布 推论一: 5.柏松分布 6. 均匀分布 7. 指数分布 8. 正态分布 9.常见分布的总结