zoukankan      html  css  js  c++  java
  • 洛谷 P1038 神经网络 Label:拓扑排序 && 坑 60分待查

    题目背景

    人工神经网络(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

    代码

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<vector>
     5 #include<queue>
     6 #include<iostream>
     7 #include<algorithm>
     8 #define MAXN 10000
     9 #define INF 0x3f3f3f3f
    10 using namespace std;
    11 
    12 struct cc{
    13     int num,u,c;
    14 }nod[MAXN];
    15 
    16 int N,kase,vis[MAXN],rG[MAXN],p;
    17 int ans[MAXN];
    18 vector<int> G[MAXN],c[MAXN];
    19 
    20 void init_(){
    21     scanf("%d%d",&N,&kase);
    22     for(int i=1;i<=N;i++){
    23         scanf("%d%d",&nod[i].c,&nod[i].u);
    24         nod[i].num=i;
    25     }
    26     for(int i=1;i<=kase;i++){
    27         int u,v,w;
    28         scanf("%d%d%d",&u,&v,&w);
    29         ++rG[v];
    30         G[u].push_back(v);
    31         c[u].push_back(w);
    32     }
    33 }
    34 
    35 void bfs(int x){
    36     ++vis[x];
    37     if(nod[x].c-nod[x].u<=0)return;
    38     for(int i=0;i<G[x].size();i++){
    39         int to=G[x][i];
    40         ++vis[to];
    41         nod[to].c+=c[x][i]*(nod[x].c-nod[x].u);
    42 //        printf("%d %d
    ",to,nod[to].c);
    43     }
    44     if(G[x].size()==0) {ans[++p]=x;}
    45     
    46 }
    47 
    48 void work(){
    49     
    50     int flag=1;
    51     while(flag){
    52         flag=0;
    53         for(int i=1;i<=N;i++){
    54             if(vis[i]<=rG[i]){
    55                 flag=1;
    56                 bfs(i);
    57             }
    58         }
    59     }
    60     
    61     sort(ans+1,ans+p+1);
    62     int have_ans=0;
    63     for(int i=1;i<=p;i++){
    64         int x=ans[i];
    65         if( nod[x].c-nod[x].u<=0 && rG[x]>0 ) continue;
    66         
    67         have_ans=1;
    68         if(rG[x]>0) printf("%d %d
    ",x,nod[x].c-nod[x].u);
    69         else printf("%d %d
    ",x,nod[x].c);
    70     }
    71     if(!have_ans) puts("NULL");
    72 }
    73 
    74 int main(){
    75 //    freopen("01.in","r",stdin);
    76     init_();
    77     work();
    78     
    79     return 0;
    80 }
    60分 >_<
    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    Exchange 2016与国内版O365混合部署(1):过程总览
    Office365与本地Exchange混合部署之邮件流介绍详情
    清理Exchange 2013和2016的Log文件(精华)
    Exchange2016日志路径
    C:/inetpub/logs/logfile/路径详解
    使用VMwareVCenterConverter迁移到虚拟机(p2v)
    WindowsServer安全基线
    利用WSUS部署更新程序
    Storefront与NetScaler的集成配置
    运维技巧(13):Exchange证书申请导入
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/6040597.html
Copyright © 2011-2022 走看看