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. BEC listen and translation exercise 36

    你所持的护照可使你享有免费医疗.Your passport qualifies you to receive free medical treatment.公司指使其职员挖对手的客户.The comp ...

  2. ajax stream 一边下载二进制数据一边处理

    最近有在做 stream 下载,并且边下载 stream 边处理功能.解析二进制的功能.最初参考了 flv.js 的 flv stream 下载处理功能,发现他并没有使用的 XMLHttpReques ...

  3. centos下安装Mysql5.7.20

    0.环境 本文操作系统: CentOS 7.2.1511 x86_64MySQL 版本: 5.7.16 1.卸载系统自带的 mariadb-lib [root@centos-linux ~]# rpm ...

  4. bzoj1067降雨量

    True和False都好搞 Maybe的情况: 1.Y年和X年的降雨量已知,X年的降雨量不超过Y年的降雨量,从Y+1到X-1年中存在至少一年的降雨量未知,从Y+1到X-1年中已知的降雨量都小于X年的降 ...

  5. SparkWriteToHFile

    1. HFile的LoadIncrement卡住 原来是因为权限,我一直以为,load函数之后是要删除文件的,但是hdfs://slave1:8020/test/info文件夹所有的是只读权限,而且考 ...

  6. java中的equals方法

    这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true, 否则, (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同 ...

  7. 解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题

    刚装好SSMS 17.1准备体验,弹出: 一番搜索,普遍办法都是安装VS2015独立shell.删除某个注册表项什么的,没用,首先这个shell我是装了的,然后也没有那个注册表项.我自己尝试过重装sh ...

  8. Ajax调用后台方法报未定义

    需要在web.config中<system.webServer>节点下添加如下内容 <handlers> <add name="ajax" verb= ...

  9. 问题:MSChart.exe;结果:微软图表控件MsChart使用方法及各种插件下载地址

    微软图表控件MsChart使用方法及各种插件下载地址 (2012-08-10 17:32:33) 转载▼ 标签: 图表 控件 下载地址 kernel32 微软 it 分类: C# 昨天在网上看到了微软 ...

  10. linux日常管理-vmstat命令

    系统负载用w查看.是什么原因造成了系统负载.查看系统负载状态 命令:vmstat vmstat就查看一次 vmstat 1 每秒钟更新一次.按ctrl+c取消. vmstat 1 5 每秒钟更新一次, ...