如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1507

来自"NOCOW"

跳转到: 导航, 搜索

不说什么了,就是简单的矩阵乘法。。。

#include <iostream>
using namespace std;
int n,t,a[51][51],b[51][51]={0},c[51][51]={0},tmp[51][51]={0};
inline void mul(int a[51][51],int b[51][51])
{
    memset(tmp,0,sizeof(tmp));
    for (int i=1;i<=n;++i)
        for (int j=1;j<=n;++j)
            for (int k=1;k<=n;++k)
                if (a[i][j]*b[j][k])
                    tmp[i][k]=1;
}
inline void power(int x)
{
    if (!x)
    {
        for (int i=1;i<=n;++i)
            for (int j=1;j<=n;++j)
                c[i][j]=1;
        return;
    }
    else if (x == 1)
    {
        memcpy(c,a,sizeof(a));
        return;
    }
    power(x>>1);
    mul(c,c);
    memcpy(c,tmp,sizeof(tmp));
    if (x&1)  mul(a,c);
    memcpy(c,tmp,sizeof(tmp));
}
int main()
{
    cin >> n;
    for (int i=1;i<=n;++i)
        for (int j=1;j<=n;++j)
        {
            cin >> t;
            if (t)  a[i][j]=1;
            else  a[i][j]=0;
        }
    power(n*(n-1));
    for (int i=n*(n-1);i<=n*(n+1);++i)
    {
        for (int j=1;j<=n;++j)
            for (int k=1;k<=n;++k)
                if (c[j][k])
                    b[j][k]=1;
        mul(a,c);
        memcpy(c,tmp,sizeof(tmp));
    }
    for (int i=1;i<=n;++i)
        for (int j=1;j<=n;++j)
            if (!b[i][j])
            {
                cout << "No" << endl;
                return 0;
            }
    cout << "Yes" << endl;
    return 0;
}
//by zzy
个人工具