先鄙視一下出題人,題目中說“僅輸出最后狀態非零的輸出層神經元狀態,并且按照編號由小到大順序輸出”。于是我最后判斷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 閱讀(138)
評論(0) 編輯 收藏 引用 所屬分類:
題目分類:基礎/模擬