先鄙视一下出题人,题目中说“仅输出最后状态非零的输出层神经元状态,并且按照编号由小到大顺序输出”。于是我最后判断c[i]!=0,后来发现是c[i]>0才输出!
本人认为对于这类简单的模拟题一定要细心再细心,看清题目是关键!认真设计测试数据调试也是关键!按照题目所给的信息一步一步来!
我一开始是第一层循环枚举起点,第二层循环枚举终点,只要起点可以发出信号就把起点的c[i]值设为0。后来发现这么做是不行的,因为起点还要向其他终点发出信号!于是改变了枚举的顺序,内外层换过来。
以下是我的代码:
#include<stdio.h>
#define size 201
#define maxint 20000000
int main()
{
FILE *fin,*fout;
long n,p,i,j,t1,t2,t3,f,c[size],u[size],w[size][size],sign[size];
fin=fopen("network.in","r");
fscanf(fin,"%ld%ld",&n,&p);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
w[i][j]=maxint;
for(i=1;i<=n;i++)
fscanf(fin,"%ld%ld",&c[i],&u[i]);
for(i=1;i<=p;i++)
{
fscanf(fin,"%ld%ld%ld",&t1,&t2,&t3);
w[t1][t2]=t3;
}
fclose(fin);// Init
while(1)
{
for(i=1;i<=n;i++)
sign[i]=0;
for(i=1;i<=n;i++)
{
f=0;// i 结点是否接收了信号
for(j=1;j<=n;j++)
if(w[j][i]!=maxint&&c[j]>0)// j 可以向 i 输出信号
{
c[i]+=w[j][i]*c[j];
sign[j]=1;
f=1;
}
if(f!=0) c[i]-=u[i];// i 接收了信号
}
for(i=1;i<=n;i++)
if(sign[i]!=0)
c[i]=0;
if(f==0) break;
}
fout=fopen("network.out","w");
f=0;
for(i=1;i<=n;i++)
if(c[i]>0)
{
fprintf(fout,"%ld %ld\n",i,c[i]);
f=1;
}
if(f==0) fprintf(fout,"NULL\n");
fclose(fout);
return 0;
}
posted on 2010-01-06 19:46
lee1r 阅读(130)
评论(0) 编辑 收藏 引用 所属分类:
题目分类:基础/模拟