先鄙視一下出題人,題目中說“僅輸出最后狀態(tài)非零的輸出層神經(jīng)元狀態(tài),并且按照編號由小到大順序輸出”。于是我最后判斷c[i]!=0,后來發(fā)現(xiàn)是c[i]>0才輸出!
本人認(rèn)為對于這類簡單的模擬題一定要細(xì)心再細(xì)心,看清題目是關(guān)鍵!認(rèn)真設(shè)計測試數(shù)據(jù)調(diào)試也是關(guān)鍵!按照題目所給的信息一步一步來!
我一開始是第一層循環(huán)枚舉起點,第二層循環(huán)枚舉終點,只要起點可以發(fā)出信號就把起點的c[i]值設(shè)為0。后來發(fā)現(xiàn)這么做是不行的,因為起點還要向其他終點發(fā)出信號!于是改變了枚舉的順序,內(nèi)外層換過來。
以下是我的代碼:
#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 結(jié)點是否接收了信號
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) 編輯 收藏 引用 所屬分類:
題目分類:基礎(chǔ)/模擬