题意
给你一个n阶矩阵,问是否满足下列条件,
aij=aji,aii=0,aij≤max(aik,ajk)
思路
先做前两个条件的判断,如果需要判断第三个条件,可以使用bitset,按值从小到大插入,记录对于每一行有哪一位比现在的小,再看现在这个数的i和j,对第i行和第j行取交,如果不为空,就不符合条件,如果所有检查完都没问题就符合条件
代码
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
int A[2501][2501];
bitset<2501> bs[2501];
typedef struct matrix
{
int val;
int x;
int y;
}matrix;
bool cmp(matrix a,matrix b)
{
return a.val<b.val;
}
matrix mat[2501*2501];
int main()
{
int n,f,e;
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&A[i][j]);
mat[i*n+j].val=A[i][j];
mat[i*n+j].x=i;
mat[i*n+j].y=j;
}
f=0;
for(int i=0;i<n;i++)
if(A[i][i]!=0)
{
f=1;
break;
}
if(f==1)
printf("NOT MAGIC\n");
else
{
for(int i=0;i<n&&f==0;i++)
for(int j=0;j<i;j++)
if(A[i][j]!=A[j][i])
{
f=1;
break;
}
if(f==1)
printf("NOT MAGIC\n");
else
{
sort(mat,mat+n*n,cmp);
e=0;
for(int i=0;i<n*n;i++)
{
while(e<n*n&&mat[e].val<mat[i].val)
{
bs[mat[e].x][mat[e].y]=1;
bs[mat[e].y][mat[e].x]=1;
e++;
}
if((bs[mat[i].x]&bs[mat[i].y]).any())
{
f=1;
break;
}
}
if(f==1)
printf("NOT MAGIC\n");
else printf("MAGIC\n");
}
}
return 0;
}