P1038 神经网络

题目背景

人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向,兰兰同学在自学了一本神经网络的入门书籍后,提出了一个简化模型,他希望你能帮助他用程序检验这个神经网络模型的实用性。

题目描述

在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子:

神经元〔编号为1)

图中,X1―X3是信息输入渠道,Y1-Y2是信息输出渠道,C1表示神经元目前的状态,Ui是阈值,可视为神经元的一个内在参数。

神经元按一定的顺序排列,构成整个神经网络。在兰兰的模型之中,神经网络中的神经无分为几层;称为输入层、输出层,和若干个中间层。每层神经元只向下一层的神经元输出信息,只从上一层神经元接受信息。下图是一个简单的三层神经网络的例子。

兰兰规定,Ci服从公式:(其中n是网络中所有神经元的数目)

公式中的Wji(可能为负值)表示连接j号神经元和 i号神经元的边的权值。当 Ci大于0时,该神经元处于兴奋状态,否则就处于平静状态。当神经元处于兴奋状态时,下一秒它会向其他神经元传送信号,信号的强度为Ci。

如此.在输入层神经元被激发之后,整个网络系统就在信息传输的推动下进行运作。现在,给定一个神经网络,及当前输入层神经元的状态(Ci),要求你的程序运算出最后网络输出层的状态。

输入输出格式

输入格式:

输入文件第一行是两个整数n(1≤n≤100)和p。接下来n行,每行两个整数,第i+1行是神经元i最初状态和其阈值(Ui),非输入层的神经元开始时状态必然为0。再下面P行,每行由两个整数i,j及一个整数Wij,表示连接神经元i、j的边权值为Wij。

输出格式:

输出文件包含若干行,每行有两个整数,分别对应一个神经元的编号,及其最后的状态,两个整数间以空格分隔。仅输出最后状态大于零的输出层神经元状态,并且按照编号由小到大顺序输出!

若输出层的神经元最后状态均为 0,则输出 NULL。

输入输出样例

输入样例#1:

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
输出样例#1:

3 1
4 1
5 1
/*
先bfs求出所有点的深度,再枚举深度进行计算
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 110
using namespace std;
int num1,head1[maxn],num2,head2[maxn],n,p,c[maxn],u[maxn],map[maxn][maxn],dep[maxn],d[maxn];
int du[maxn];
bool vis[maxn];
struct node{
int to,pre,v;
}e1[],e2[];
void Insert1(int from,int to,int v){
e1[++num1].to=to;
e1[num1].v=v;
e1[num1].pre=head1[from];
head1[from]=num1;
}
void Insert2(int from,int to,int v){
e2[++num2].to=to;
e2[num2].v=v;
e2[num2].pre=head2[from];
head2[from]=num2;
}
queue<int>q;
void Bfs(){
for(int i=;i<=n;i++)
if(du[i]==){
vis[i]=;
map[][++map[][]]=i;
q.push(i);
}
while(!q.empty()){
int now=q.front();q.pop();
for(int i=head1[now];i;i=e1[i].pre){
int to=e1[i].to;
if(vis[to])continue;
vis[to]=;
dep[to]=dep[now]+;
map[dep[to]][++map[dep[to]][]]=to;
q.push(to);
}
}
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d%d",&n,&p);
for(int i=;i<=n;i++){
scanf("%d%d",&c[i],&u[i]);
}
int x,y,z;
for(int i=;i<=p;i++){
scanf("%d%d%d",&x,&y,&z);
Insert1(x,y,z);Insert2(y,x,z);
du[y]++;d[x]++;
}
Bfs();
for(int i=;i<=n;i++){
if(map[i][]==)break;
for(int j=;j<=map[i][];j++){
int now=map[i][j];
for(int k=head2[now];k;k=e2[k].pre){
int to=e2[k].to;
if(c[to]>)c[now]+=e2[k].v*c[to];
}
c[now]-=u[now];
}
}
bool flag=;
for(int i=;i<=n;i++){
if(d[i]==&&c[i]>){
printf("%d %d\n",i,c[i]);
flag=;
}
}
if(!flag)printf("NULL");
return ;
}

100分 非拓扑排序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define maxn 201
using namespace std;
int num,head[maxn],n,m,rudu[maxn],chudu[maxn],u[maxn],c[maxn];
bool vis[maxn];
struct node{
int to,pre,v;
}e[maxn*];
void Insert(int from,int to,int v){
e[++num].to=to;
e[num].v=v;
//e[num].from=from;
e[num].pre=head[from];
head[from]=num;
}
void Topsort(){
queue<int>q;
for(int i=;i<=n;i++){
if(rudu[i]==)vis[i]=,q.push(i);
else c[i]-=u[i];
}
while(!q.empty()){
int now=q.front();q.pop();
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
rudu[to]--;
if(rudu[to]==){
q.push(to);
vis[to]=;
}
if(c[now]>)
c[to]+=e[i].v*c[now];
}
}
bool flag=;
for(int i=;i<=n;i++){
if(chudu[i]==&&c[i]>){
printf("%d %d\n",i,c[i]);
flag=;
}
}
if(!flag)printf("NULL");
}
int main(){
freopen("Cola.txt","r",stdin);
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d%d",&c[i],&u[i]);
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
Insert(x,y,z);
rudu[y]++;chudu[x]++;
}
Topsort();
return ;
}

100分 拓扑排序

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

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

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

  2. 洛谷——P1038 神经网络

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

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

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

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

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

  5. 洛谷 P1038 神经网络

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

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

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

  7. 洛谷P1038神经网络题解

    题目 这个题不得不说是一道大坑题,为什么这么说呢,这题目不仅难懂,还非常适合那种被生物奥赛刷下来而来到信息奥赛的学生. 因此我们先分析一下题目的坑点. 1: 题目的图分为输入层,输出层,以及中间层. ...

  8. 洛谷P1038神经网络

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

  9. 洛谷P1038 神经网络题解

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

随机推荐

  1. 分享知识-快乐自己:解决 Maven 无法下载 fastdfs-client-java 依赖。

    因为fastdfs-client-java-1.27-SNAPSHOT.jar这个依赖包在maven中央仓库是没有的. 需要自己编译源码成jar本地安装到maven 的本地仓库,安装完以后就能正常引用 ...

  2. Python基础-读取excel

    import xlrdbook = xlrd.open_workbook('lanxia.xls')sheet = book.sheet_by_name('sheet1')rows = sheet.n ...

  3. Linux基本语法

    Shell编程 摘要: Shell历史 Shell的作用是解释用户的命令,用户输入一条命令,Shell就解释执行一条,这条方式称为交互式(interactive),Shell还有一种执行命令的方式称为 ...

  4. BEC listen and translation exercise 45

    So the Counselling Services we offer deal with any problems arising from your studies or in your lif ...

  5. windows下面的python的MySQLdb环境安装

    什么是MySQLdb? MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的. 如何安装MySQ ...

  6. CodeForces - 605C 凸包+直线与凸包判交

    题目大意: 要完成两种属性p,q的需求,给定n个双属性物品及其单位个物品中含有的属性,要求选择最少的物品来达成属性需求.(可以选择实数个物品) 题解: 实际上是一种属性混合问题 我们知道对于两种双属性 ...

  7. HDU1042(N!:设4为基数)

    N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submi ...

  8. JSP介绍(4)--- JSP 过滤器

    过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的: 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理这些响应. 过滤器通过 Web 部署描述符 ...

  9. maven---工程建立及目录添加--

    刚开始建立maven工程目录1: 添加web能力: 选中工程鼠标右击点MyEclipse添加web能力: 然后: 关键点:remove掉Excluded:** 添加javaEE5库 确保web: 建p ...

  10. c语言基础 c和指针

    句子 c规定数组名代表数组首元素的地址 如果&a 则代表整个数组 没有内存哪来的指针 数据类型的本质:固定大小内存的别名 变量的本质:(一段连续)内存空间的别名,内存空间的标号 指针是一种数据 ...