天天看点

【Codefoeces 402E】一个有趣的转化

1.​​题目链接​​。题目大意:给定一个矩阵原来矩阵里面所有的数据都是非负数,让你确定是不是存在一个k使得这个矩阵的k次幂之后,矩阵的每一个数据都是正数。

#include<bits/stdc++.h>
#include <iostream>
#pragma warning(disable:4996)
using namespace std;
const int N = 2e3 + 10;
int gra[N][N];
int sta[N], vis[N], low[N], dfn[N], top;
void tarbfs(int k, int cnt, int &num, int n) 
{

  vis[k] = 1;
  low[k] = cnt;
  dfn[k] = cnt;
  for (int j = n; j > 0; j--) 
  {
    if (gra[k][j] > 0 && vis[j] == 0) tarbfs(j, ++cnt, num, n);
    if (gra[k][j] > 0 && vis[j] == 1) low[k] = min(low[k], low[j]);
  }
  if (dfn[k] == low[k])
  {
    ++num;
  }
}
int tarjan(int n) {
  int num = 0, cnt = 1;
  top = 0;
  memset(vis, 0, sizeof(vis));
  memset(low, 0, sizeof(low));
  for (int i = 1; i <= n; i++) {
    if (vis[i] == 0) tarbfs(i, cnt, num, n);
  }
  return num;
}
int main()
{
  int n, a;
  while (cin >> n) 
  {
    memset(gra, 0, sizeof(gra));
    for (int i = 1; i <= n; i++) 
    {
      for (int j = 1; j <= n; j++) 
      {
        scanf("%d", &a);
        if (a > 0) gra[i][j] = 1;
      }
    }
    int num = tarjan(n);
    if (num == 1) puts("YES");
    else puts("NO");
  }
  return 0;
}