标签:acm算法 algorithm matrix iostream struct
被坑了两个小时。。。
题意:一个矩阵B等于矩阵A。()。。
对A的K次方(K有范围)求和。。
给定一个n*n的矩阵A。问你求出的B矩阵是否存在0.
有0就NO
否则就YES。
第一想法是直接矩阵快速幂暴力求解。。
后来T 了。一直纠结了两个小时。。。
最后才知道矩阵要用bool 定义。。
不然k太大的话乘法必然会溢出。。
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
using namespace std;
__int64 n;
struct node
{
bool a[55][55]; //bool 类型的矩阵,值只有0和一。。
};
node mut_mut(node e,node d) //两个矩阵相乘
{
__int64 i,j,k;
node m;
memset(m.a,0,sizeof(m.a));
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
for(k=1; k<=n; k++)
m.a[i][j]+=e.a[i][k]*d.a[k][j];
return m;
}
node fastmi(node a1,__int64 cishu) //快速幂
{
__int64 i;
node f;
memset(f.a,0,sizeof(f.a));
for(i=1; i<=n; i++)
f.a[i][i]=1; //初始化单位矩阵。
while(cishu)
{
if(cishu&1)
f=mut_mut(f,a1);
a1=mut_mut(a1,a1);
cishu>>=1;
}
return f;
}
node xiangjia(node c,node b) //相加。。
{
__int64 i,j;
node u;
memset(u.a,0,sizeof(u.a));
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(c.a[i][j]==0 &&b.a[i][j]==0)
continue;
u.a[i][j]+=c.a[i][j]+b.a[i][j];
}
}
return u;
}
int main()
{
__int64 i,j,p,l;
node c,last,v,t;
while(~scanf("%I64d",&n))
{
int flag=1;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
scanf("%I64d",&c.a[i][j]);
i=n*(n-1);
l=n*(n+1);
memset(t.a,0,sizeof(t.a));
for(p=i; p<=l; p++)
{
v=fastmi(c,p);
t=xiangjia(t,v); //直接在k的范围内暴力出矩阵B。
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
cout<<t.a[i][j]<<" ";
if(t.a[i][j]==0)
{
flag=0;
break;
}
}
if(!flag)
break;
}
if(!flag)
printf("No\n");
else
printf("Yes\n");
memset(t.a,0,sizeof(t.a));
}
return 0;
}
标签:acm算法 algorithm matrix iostream struct
原文地址:http://blog.csdn.net/sky_miange/article/details/44698483