P1038 神经网络

传送门

思路:

  直接用拓扑排序,套用题目给的公式就行了。。

标程:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<deque>
#include<set>
#include<map>
using namespace std;
#define maxn 10010
typedef long long LL;
LL st[maxn],head[maxn],n,m;
LL top,in[maxn],out[maxn],cnt,C[maxn],U[maxn];//in[]记录入度,用来topo,out[]记录出度,记录输出层的神经(没有出度的点)
struct hh
{
    LL nex,to,dis;
}t[maxn];
inline LL read()
{
    LL xs=0,kr=1;char ls;
    ls=getchar();
    while(!isdigit(ls))
    {
        if(!(ls^45))
            kr=-1;
        ls=getchar();
    }
    while(isdigit(ls))
    {
        xs=(xs<<1)+(xs<<3)+(ls^48);
        ls=getchar();
    }
    return xs*kr;
}
inline void add(LL nex,LL to,LL dis)
{
    t[++cnt].nex=head[nex];
    t[cnt].to=to;
    t[cnt].dis=dis;
    head[nex]=cnt;
}
int main()
{
    n=read();m=read();
    for(LL i=1;i<=n;i++)
    {
        C[i]=read();U[i]=read();
        if(C[i]) st[++top]=i;
    }
    LL x,y,z;
    for(LL i=1;i<=m;i++)
    {
        x=read();y=read();z=read();
        add(x,y,z);
        in[y]++;out[x]++;
    }
    LL u,v;
    while(top>0)
    {
        u=st[top--];
        if(C[u]<=0) continue;//C[u]<=0说明这个神经元没有活性,不会继续传递信息,跳过。 
        for(LL i=head[u];i;i=t[i].nex)
        {
            v=t[i].to;
            in[v]--;
            C[v]+=t[i].dis*C[u];//对于有活性的神经元,套用公式。 
            if(in[v]==0)//没有入度,扔回栈中,作为下一个要传递信息的神经元,更新活性 
            {
                st[++top]=t[i].to;
                C[v]-=U[v];
            }
        }
    }
    bool flag=false;
    for(LL i=1;i<=n;i++)
      if(!out[i]&&C[i]>0) printf("%lld %lld\n",i,C[i]),flag=true;//输出层的神经元出度为 0,对于活性≤0的神经元,再次跳过
    if(!flag) printf("NULL\n");//没有一个输出层的神经元有活性,输出“NULL” 
}

 

posted @ 2018-10-19 22:19  落笔映惆怅丶  阅读(158)  评论(0编辑  收藏  举报