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” }