#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <iomanip>
using namespace std;
const int MAX_NUM = 10000;
// 脉冲元素
int r[MAX_NUM];
//神经元元素
double I[MAX_NUM][1001];
double v[MAX_NUM];
double u[MAX_NUM];
double a[MAX_NUM];
double b[MAX_NUM];
vector<int> cnt;
int max_cnt = -1;
int min_cnt = 2 << 29;
double max_v = -1000000;
double min_v = 2 << 29;
// 发送完脉冲后的默认值
double c[MAX_NUM];
double d[MAX_NUM];
//突触元素
struct nn
{
int tail;
double w;
int D;
};
// unordered_map<int, unordered_map<int, double>> w;
// unordered_map<int, unordered_map<int, int>> D;
unordered_map<int, vector<nn>> edge;
unordered_map<int, vector<int>> go;
int S_in[MAX_NUM];
int S_out[MAX_NUM];
double dt = 0;
static unsigned long next0 = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next0 = next0 * 1103515245 + 12345;
return((unsigned)(next0/65536) % 32768);
}
double cv(int i,int k)
{
return v[i] + dt * (0.04 * v[i] * v[i] + 5 * v[i] + 140 - u[i]) + I[i][k];
}
double cu(int i)
{
return u[i] + dt * a[i] * (b[i] * v[i] - u[i]);
}
int main()
{
int N, P, S, T;
cin >> N >> S >> P >> T;
cin >> dt;
int tmp_N = N;
int cnt_N = 0;
while(tmp_N > 0)
{
int RN;
cin >> RN;
double vv , uu, aa, bb, cc, dd;
cin >> vv >> uu >> aa >> bb >> cc >> dd;
for (int i = 0; i < RN; i++)
{
int tmp_cnt_N = cnt_N++;
//cout << tmp_cnt_N << endl;
v[tmp_cnt_N] = vv;u[tmp_cnt_N] = uu;a[tmp_cnt_N] = aa;b[tmp_cnt_N] = bb;c[tmp_cnt_N] = cc;d[tmp_cnt_N] = dd;
cnt.push_back(0);
}
tmp_N -= RN;
}
for (int i = 0; i < P; i++)
{
cin >> r[i + N];
}
for (int i = 0; i < S; i++)
{
nn nn_t;
cin >> S_in[i] >> nn_t.tail;
cin >> nn_t.w;
cin >> nn_t.D;
//go[S_in[i]].push_back(S_out[i]);
edge[S_in[i]].push_back(nn_t);
}
for (int time = 1; time <= T; time++)
{
// 首先处理脉冲源来计算IK,还有突触
for (int i = 0; i < P; i++)
{
int nows = i + N;
int em = myrand();
if(r[nows] > em)
{
int len = edge[nows].size();
for (int i = 0; i < len; i++)
{
int next_i = edge[nows][i].tail;
int D_i = edge[nows][i].D;
int w_i = edge[nows][i].w;
I[next_i][time + D_i] += w_i;
//cout << nows <<" " << next_i << " "<< w_i << endl;
}
}
}
// 其次再分析神经元
for (int i = 0; i < N; i++)
{
int nows = i;
// 更新v 和 u
double v_nows = cv(nows, time);
double u_nows = cu(nows);
v[nows] = v_nows;
u[nows] = u_nows;
//判断是否传播
if(v[nows] >= 30)
{
v[nows] = c[nows];
u[nows] += d[nows];
cnt[nows]++;
int len = edge[nows].size();
for (int i = 0; i < len; i++)
{
int next_i = edge[nows][i].tail;
int D_i = edge[nows][i].D;
int w_i = edge[nows][i].w;
I[next_i][time + D_i] += w_i;
//cout << nows <<" " << next_i << " "<< w_i << endl;
}
}
//cout << v[nows] << " ";
}
//cout << endl;
}
for (int i = 0; i < N; i++)
{
if(v[i] > max_v)
max_v = v[i];
if(v[i] < min_v)
min_v = v[i];
if(cnt[i] > max_cnt)
max_cnt = cnt[i];
if(cnt[i] < min_cnt)
min_cnt = cnt[i];
}
cout << fixed << setprecision(3)<< min_v << " " << max_v << endl;
cout << min_cnt << " " << max_cnt;
return 0;
}
你可以到 AcWing 上测试,错误样例太长了我就不在这贴了。