神经网络—拓扑排序
输入格式
第一行是两个整数n(1≤n≤100)和p。
接下来n行,每行两个整数,第i+1行是神经元i最初状态和其阈值(Ui),非输入层的神经元开始时状态必然为0。
再下面P行,每行由两个整数i,j及一个整数Wij,表示连接神经元i、j的边权值为Wij。
输出格式
输出文件包含若干行,每行有两个整数,分别对应一个神经元的编号,及其最后的状态,两个整数间以空格分隔。仅输出最后状态非零的输出层神经元状态,并且按照编号由
小到大顺序输出!
若输出层的神经元最后状态均为 0,则输出 NULL。
样例
样例输入
5 6 1 0 1 0 0 1 0 1 0 1 1 3 1 1 4 1 1 5 1 2 3 1 2 4 1 2 5 1
样例输出
3 1 4 1 5 1
简单の思路:显然,这是一道拓扑排序的模板题,题目灰常之长,damn是只有一乃乃有用信息,这道题的指向性非常明确,就是让我们每一个点每一个点地去算值,只不过要用到前驱节点,而且我们要自行确定输入节点。神经网络结构满足 DAG,且我们就要进行类似 DP 一样的操作。我们可以使用拓扑排序确定顺序,再进行统计。
ACcode:
#include <bits/stdc++.h> using namespace std; const int N=110; int n,m,u,x,y,z,tot,cnt; int ans[N],head[N],out[N],in[N],num[N]; bool flag=0; queue<int>q; struct node{ int to,p,next; }edge[N]; void add(int x,int y,int z){ edge[++tot].to=y; edge[tot].next=head[x]; edge[tot].p=z; head[x]=tot; } void topological_sort(){ for(int i=1;i<=n;i++) if(in[i]==0) q.push(i); while(!q.empty()){ int x=q.front(); q.pop(); num[++cnt]=x; for(int i=head[x];i;i=edge[i].next){ int y=edge[i].to; if(--in[y]==0) q.push(y); if(ans[x]>0) ans[y]+=edge[i].p*ans[x]; } } } int main(){ ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>ans[i]>>u; if(ans[i]==0) ans[i]-=u; } for(int i=1;i<=m;i++){ cin>>x>>y>>z; add(x,y,z); in[y]++; out[x]++; } topological_sort(); for(int i=1;i<=n;i++){ if(out[i]==0&&ans[i]>0){ cout<<i<<' '<<ans[i]<<endl; flag=1; } } if(!flag) cout<<"NULL"; return 0; }
#一名爱打篮球的oier#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】