【正经题解】神经网络
2024-02-21 10:38:21
发布于:美国
31阅读
0回复
0点赞
拓扑排序~
这题为什么用 做呢?
首先这个图是一个 。。考虑 上的算法
他告诉你了公式了,所有的节点的权值是从他的上一个节点推过来的,所以这是 上的递推关系,我们一般用拓扑排序做。
首先,输入层的 是没用的(你可以发现他们的 是永远是 )(然而我特判了一下,变成了 因为题里面没好像没说啊 ),而中间层和输出层的 可以在初始直接减到 中
我没有开一个栈或者是一个队列,因为 比较小,我直接暴力找入度为 的节点。出度不需要更新(因为最后出度是为了判断输出层的)
注意几个坑点:只输出大于 的输出层(要同时满足这两个条件),输出层的判定可以直接记录出度,出度为 的一定是输出层。在 的判定中,我们只判定输出层的 是否大于 。如果输出层的 都≤ ,那么就输出 。
还有就是如果一个神经元的状态是负的,那么他不会往后传递神经信号。
#include<iostream>
#include<cstdio>
#define _ 0
using namespace std;
struct edge
{
int v,w,ne;
}a[5000];
int n,p,tmp;
int c[110],u[110],h[110],in[110],out[110];
bool v[110];
int main()
{
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&c[i],&u[i]);
if(c[i]>0)u[i]=-1;
}
for(int s,d,w,i=1;i<=p;i++)
{
scanf("%d%d%d",&s,&d,&w);
a[++tmp]=(edge){d,w,h[s]};
h[s]=tmp;
in[d]++;
out[s]++;
}
for(int tmp=1;tmp<=n;tmp++)
{
for(int i=1;i<=n;i++)
{
if(in[i]==0&&v[i]==0)
{
v[i]=1;
if(u[i]!=-1)c[i]-=u[i];
for(int j=h[i];j>0;j=a[j].ne)
{
if(c[i]>0)
{
c[a[j].v]+=c[i]*a[j].w;
}
in[a[j].v]--;
}
break;
}
}
}
bool flag=0;
for(int tmp=1;tmp<=n;tmp++)
{
if(out[tmp]==0&&c[tmp]>0)flag=1;
}
if(flag)
{
for(int tmp=1;tmp<=n;tmp++)
{
if(out[tmp]==0&&c[tmp]>0)
{
printf("%d %d\n",tmp,c[tmp]);
}
}
}
else
{
printf("NULL");
}
return ~~(0^_^0);
}
全部评论 1
funny
2024-07-28 来自 广东
0
有帮助,赞一个