1 条题解
-
0

// 拓扑排序 O(n) #include<bits/stdc++.h> using namespace std; const int N=105; vector<pair<int,int>> e[N]; int n,m; int C[N],U[N],rd[N],cd[N]; void topo(){ queue<int> q; for(int i=1; i<=n; i++){ if(rd[i]==0) q.push(i); //输入层的点均入队 else C[i]-=U[i]; //其他层先减阈值Ui(点权) } while(!q.empty()){ int u=q.front(); q.pop(); for(auto [v,w]:e[u]){ if(C[u]>0) C[v]+=C[u]*w; //如果u点能兴奋,则向v点发送信号C[u] if(--rd[v]==0) q.push(v); } } } int main(){ cin>>n>>m; //n个神经元 m条边 for(int i=1;i<=n;i++) cin>>C[i]>>U[i]; //每个点的最初状态和阈值 for(int i=1,u,v,w; i<=m; i++){ cin>>u>>v>>w; //从点u到点v的边权w e[u].emplace_back(v,w); cd[u]++; //u的出度+1 rd[v]++; //v的入度+1 } topo(); bool ok=0; for(int i=1;i<=n;i++)if(!cd[i]&&C[i]>0){ //如果是输出层且状态>0的点 cout<<i<<" "<<C[i]<<"\n",ok=1; } if(!ok) cout<<"NULL"; }
- 1
信息
- ID
- 633
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 15
- 已通过
- 9
- 上传者