博客
关于我
E. Strictly Positive Matrix [强联通+矩阵幂转图论+缩点] 好题
阅读量:537 次
发布时间:2019-03-08

本文共 2294 字,大约阅读时间需要 7 分钟。

E. Strictly Positive Matrix
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You have matrix a of size n × n. Let's number the rows of the matrix from 1 to n from top to bottom, let's number the columns from 1 to nfrom left to right. Let's use aij to represent the element on the intersection of the i-th row and the j-th column.

Matrix a meets the following two conditions:

  • for any numbers i, j (1 ≤ i, j ≤ n) the following inequality holds: aij ≥ 0;
  • .

Matrix b is strictly positive, if for any numbers i, j (1 ≤ i, j ≤ n) the inequality bij > 0 holds. You task is to determine if there is such integer k ≥ 1, that matrix ak is strictly positive.

Input

The first line contains integer n (2 ≤ n ≤ 2000) — the number of rows and columns in matrix a.

The next n lines contain the description of the rows of matrix a. The i-th line contains n non-negative integers ai1, ai2, ..., ain(0 ≤ aij ≤ 50). It is guaranteed that .

Output

If there is a positive integer k ≥ 1, such that matrix ak is strictly positive, print "YES" (without the quotes). Otherwise, print "NO" (without the quotes).

Examples
input
Copy
21 00 1
output
NO
input
Copy
54 5 6 1 21 2 3 4 56 4 1 2 41 1 1 1 14 4 4 4 4
output
YES

题意:给定一个矩阵A,其中A[i][j]>=0 && sigma[i][i]>0 问,是否存在K,使得B=A^K,其中B[i][j]>0

思路:矩阵乘法转图论. A^k大于0,代表所有元素直接是联通.

B=A^K 中 b[i][j]代表i到j长度为k的路条数

#include
#define bug cout <<"bug"<
edge[MAX_N];int n,cur,cnt,top,mp[MAX_N],DFN[MAX_N],LOW[MAX_N],s[MAX_N];void tarjan(int u){ DFN[u]=LOW[u]=cur++; s[++top]=u; for(int i=0;i<(int)edge[u].size();i++){ int v=edge[u][i]; if(!DFN[v]){ tarjan(v); LOW[u]=min(LOW[u],LOW[v]); } else if(DFN[v] && !mp[v]) LOW[u]=min(LOW[u],DFN[v]); } if(DFN[u]==LOW[u]){ int v=-1; cnt++; while(u!=v){ v=s[top--]; mp[v]=cnt;// cout << v<<" "; }// puts("************"); }}int main(void){ read(n); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int x;read(x); if(i==j) continue; if(x>0) edge[i].push_back(j); } } for(int i=1;i<=n;i++) if(!DFN[i]) tarjan(i);// cout << cnt << endl; if(cnt==1) cout <<"YES"<

转载地址:http://jkkiz.baihongyu.com/

你可能感兴趣的文章
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>