原题链接:CCF-CSP 202109-3 脉冲神经网络
#includeusing namespace std; #define ll unsigned long long const int N=1010; static unsigned long nnext = 1; int myrand(void) { nnext = nnext * 1103515245 + 12345; return((unsigned)(nnext/65536) % 32768); } struct Node { double v,u,a,b,c,d; int num; int r; }node[2010]; double Ik[N][N];//表示该神经元在K时刻接受到的所有脉冲输入的强度之和 int mod=0; struct tuchu { int t,D; double w; tuchu(int _t,double _w,int _D):t(_t),w(_w),D(_D) {} }; vector g[2010]; int main() { std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int N,S,P,T; cin>>N>>S>>P>>T;//一共有N 个神经元,S个突触和 P个脉冲源,输出时间刻 T时神经元的 v值。 int NP=N,SP=S,PP=P; double dt; cin>>dt;//时间间隔。 int cur=0; while(N>0) { int RN; double v,u,a,b,c,d; cin>>RN; cin>>v>>u>>a>>b>>c>>d; for(int i=cur;i node[i].v=v; node[i].u=u; node[i].a=a; node[i].b=b; node[i].c=c; node[i].d=d; } cur+=RN; N-=RN; } N=NP; while(P--) { int r; cin>>r; node[cur].r=r; cur++; } P=PP; while(S--) { int s,t,D; double w; cin>>s>>t>>w>>D; g[s].push_back(tuchu(t,w,D)); mod=max(mod,D+1); } S=SP; int f=0; for(int ttmp=1;ttmp<=T;ttmp++) { if(ttmp==T) f=1; int tt=ttmp%mod; for(int now=N;now int my=myrand(); if(node[now].r>my) { for(int i=0;i int to=g[now][i].t; double w=g[now][i].w; int D=g[now][i].D; //cout< double vv=node[now].v; double uu=node[now].u; double a=node[now].a; double b=node[now].b; node[now].v=vv+dt*(0.04*vv*vv+5*vv+140-uu)+Ik[tt][now]; node[now].u=uu+dt*a*(b*vv-uu); if(node[now].v>=30) { node[now].v=node[now].c; node[now].u+=node[now].d; node[now].num++; for(int i=0;i int to=g[now][i].t; double w=g[now][i].w; int D=g[now][i].D; Ik[(tt+D)%mod][to]+=w; } } //cout< maxv=max(node[i].v,maxv); minv=min(node[i].v,minv); maxnum=max(node[i].num,maxnum); minnum=min(node[i].num,minnum); } cout<



