输入格式
第一行是两个整数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#
标签:输出,int,拓扑,tot,神经网络,edge,ans,排序,神经元 From: https://www.cnblogs.com/hzoiwzs/p/18060321