洛谷P1038神经网络题解
因此我们先分析一下题目的坑点。
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神经网络题解的更多相关文章
- 洛谷P1038 神经网络题解
注意如果是 \(if(c[i])\) 这条语句并没有说明c[i]不为负数,所以说最好老老实实的写 #include<cstdio> #define _ 0 using namespace ...
- 洛谷P1038 神经网络==codevs1088 神经网络
P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...
- 洛谷P1038 神经网络
P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...
- 洛谷——P1038 神经网络
P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...
- 洛谷 P1038 神经网络 Label:拓扑排序 && 坑 60分待查
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- 洛谷P1038 神经网络(bfs,模拟,拓扑)
题目背景 人工神经网络(Artificial Neural NetworkArtificialNeuralNetwork)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸 ...
- 洛谷 P1038 神经网络
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- [NOIP2003] 提高组 洛谷P1038 神经网络
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- 洛谷P1038神经网络
传送门啦 一个拓扑排序的题,感觉题目好难懂... #include <iostream> #include <cstdio> #include <cstring> ...
随机推荐
- Plugin 'Lombok Plugin' is incompatible with this installation
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. Installation Error Plugin 'Lombok ...
- flask实现子域名
什么是子域名? 子域名,类似于xxx.douban.com的形式,如book.douban.com,music.douban.com,movie.douban.com等 用flask怎么实现子域名? ...
- flask 跨域请求
Flask中,跨域请求主要有两种方式: 1.在响应头信息中添加允许跨域 如下,使用装饰器app.after_request(我这里的web是定义的蓝图),这样在每次请求后,加入header 2.使用第 ...
- mariadb(第一章)
数据库介绍 1.什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来 ...
- Kickstart Practice Round 2017---A
Problem The Constitution of a certain country states that the leader is the person with the name con ...
- 批量采集世纪佳缘会员图片及winhttp异步采集效率
原始出处:http://www.cnblogs.com/Charltsing/p/winhttpasyn.html 最近老有人问能不能绕过世纪佳缘的会员验证来采集图片,我测试了一下,发现是可以的. 同 ...
- CSS响应式布局实例
<style type="text/css"> body{ margin:0 auto; min-width: ...
- tomcat启动的时候报错Failed to start component
在idea中运行tomcat时,遇到异常,异常信息如下: 16-Jan-2018 16:33:37.325 信息 [localhost-startStop-1] org.apache.catalina ...
- LLVM的安装
1. 官网下载 llvm 2. 官网下载cmake 3. configure 执行 llvm 发现报错 4. 解压缩 cmake 5.将cmake 下面的bin 目录放到环境变量里面去 6. 创建一个 ...
- Java基础——对象容器(顺序、集合、Hash)
扩展: For-each循环 for (String s: str) { System.out.println(s); } 等同于for (int i = 0; i < str.length; ...