考虑矩阵乘法在图论下的意义
Aki,j>0
意味着
i
到
我们考虑两两之间都有路径 那么必定是一整个强连通分量 这是必要性
因为至少有子环 当
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define read(x) scanf("%d",&(x))
using namespace std;
const int N=2005;
struct edge{
int u,v,next;
}G[N*N];
int head[N],inum;
inline void add(int u,int v){
int p=++inum; G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;
}
#define V G[p].v
int pre[N],low[N],clk;
int scc[N],cnt; int Stack[N],pnt;
#define V G[p].v
inline void dfs(int u){
pre[u]=low[u]=++clk; Stack[++pnt]=u;
for (int p=head[u];p;p=G[p].next)
if (!pre[V])
dfs(V),low[u]=min(low[u],low[V]);
else if (!scc[V])
low[u]=min(low[u],pre[V]);
if (low[u]==pre[u]){
++cnt;
while (Stack[pnt]!=u) scc[Stack[pnt--]]=cnt; scc[Stack[pnt--]]=cnt;
}
}
int n,x;
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
read(x);
if (x) add(i,j);
}
for (int i=1;i<=n;i++)
if (!pre[i])
dfs(i);
if (cnt!=1)
printf("NO\n");
else
printf("YES\n");
return 0;
}