心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0

先鄙视一下出题人,题目中说“仅输出最后状态非零的输出层神经元状态,并且按照编号由小到大顺序输出”。于是我最后判断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==0break;
    }

    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 阅读(122) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:基础/模拟

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理