洛谷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> ...
随机推荐
- Python_迭代器-生成器-复习-习题_41
# 迭代器和生成器# 迭代器 # 可迭代协议 —— 含有iter方法的都是可迭代的 # 迭代器协议 —— 含有next和iter的都是迭代器 # 特点 # 节省内存空间 # 方便逐个取值,一个迭代器只 ...
- 通过Webstorm上传代码到Github、更新代码后同步到github及克隆github代码到本地的方法
导读: Github做为IT爱好者分享代码的一个知名的平台,广受大家喜欢,那么我们平时该怎么将自己写的代码上传到github上面保存并且提供给其他人参考? 我想方法不外乎如下几个: 1.直接在gith ...
- bootstrap简单使用
Bootstrap (版本 v3.3.7) 官网教程: https://v3.bootcss.com/css/ row——行 row——列 push——推 pull——拉 col-md-o ...
- centos7 network eno16777736
Network service not running - eno16777736 not activated - CentOShttps://www.centos.org/forums/viewto ...
- Mysql占用CPU过高如何优化?(转)
原文:http://bbs.landingbj.com/t-0-241441-1.html MySQL处在高负载环境下,磁盘IO读写过多,肯定会占用很多资源,必然CP会U占用过高. 占用CPU过高,可 ...
- Python PEP8 编码规范中文版
原文链接:https://legacy.python.org/dev/peps/pep-0008/ 参考:https://blog.csdn.net/ratsniper/article/details ...
- Laravel中resource方法
新增的 resource 方法将遵从 RESTful 架构为用户资源生成路由.该方法接收两个参数,第一个参数为资源名称,第二个参数为控制器名称. Route::resource('users', 'U ...
- Oracle Flashback 详解
Oracle flashback 是一种方便快捷的数据库恢复技术,它不使用备份文件,通过闪回日志可以使数据库恢复到过去的某个状态,当用户发生逻辑错误时(误删表数据.表.表空间等)需要快速恢复数据库,可 ...
- Prime Permutation
Prime Permutation 原题地址: http://codeforces.com/problemset/problem/123/A 题目大意: 给你一个字符串(只包含小写字母),从1开始存放 ...
- spring AOP源码分析(三)
在上一篇文章 spring AOP源码分析(二)中,我们已经知道如何生成一个代理对象了,那么当代理对象调用代理方法时,增强行为也就是拦截器是如何发挥作用的呢?接下来我们将介绍JDK动态代理和cglib ...