随机化算法之三

#include <iostream>        //poj 3318
using namespace std;
int ma[505][505],mb[505][505],mc[505][505],n;
int main()
{
scanf(
"%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf(
"%d",&ma[i][j]); //cin 会TLE
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf(
"%d",&mb[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf(
"%d",&mc[i][j]);
int init[505],res1[505],res2[505],res3[505],s;

for(int i=1;i<=n;++i)
init[i]
=rand()%100; //随机生成行向量I
for(int j=1;j<=n;++j)
{
s
=0;
for(int i=1;i<=n;++i)
s
+=init[i]*ma[i][j];
res1[j]
=s;
}
for(int j=1;j<=n;++j)
{
s
=0;
for(int i=1;i<=n;++i)
s
+=res1[i]*mb[i][j];
res2[j]
=s;
}
for(int j=1;j<=n;++j)
{
s
=0;
for(int i=1;i<=n;++i)
s
+=init[i]*mc[i][j];
res3[j]
=s;
}
for(int j=1;j<=n;++j)
if(res2[j]!=res3[j])
{
printf(
"NO\n");
return 0;
}
printf(
"YES\n");
return 0;
}
//随机生成行向量I,则若A*B=C,那么必有I*A*B=I*C;
//逐一测试是否相等,时间复杂度是O(N^2),算法的随机性正体现在这里。

  

posted on 2011-08-23 17:07  sysu_mjc  阅读(159)  评论(0编辑  收藏  举报

导航