洛谷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> ...
随机推荐
- gohost -- go 开发的命令行hosts配置管理工具
前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,什么时候命令行也可以这么抢到了,
- Python全栈开发之路 【第六篇】:Python基础之常用模块
本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...
- H5 71-网易注册界面4
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PAT L3-007 天梯地图
https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 本题要求你实现一个天梯赛专属在线地图,队员输 ...
- VMware虚拟机与Windows文件共享
开发中,我们经常的需求是这样的:我想再Windows中进行快捷开发,但是想在linux中运行,那么需要将文件方便在linux中管理,基本可以分成两种方式: 1. 使用网络工具:vmware_tool工 ...
- python与C,在写程序时踩过的坑!
1. python与C有很多相似之处, 其一就是指针的大量应用, 因此在使用临时变量保存数据, 并将临时变量传递给其他变量时需要创建内存; 例如,在C中, char *temp 每次获取到不同的字 ...
- gulp项目和webpack项目在浏览器中查看的方式
在存在.git的目录下,按住shift+左键,打开命令行或者使用git Bash Gulp: 输入gulp dev 本地起一个服务器,在项目中找到gulp.js,然后找本地服务器,找到host和por ...
- 剑指offer(20)二叉搜索树与双向表
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路一:递归法 1.将左子树构造成双链表,并返回链表头节点. 2.定位至左子 ...
- MySQL的备份和回复
一.备份的原因 二.备份的类型 三.备份的方式 四.备份策略 五.备份工具
- mysql数据库修改数据表引擎的方法
对于MySQL数据库,如果你要使用事务以及行级锁就必须使用INNODB引擎.如果你要使用全文索引,那必须使用myisam. INNODB的实用性,安全性,稳定性更高但是效率比MYISAM稍差,但是有的 ...