zoukankan      html  css  js  c++  java
  • Codeforces Round #236 (Div. 2)E. Strictly Positive Matrix(402E)

                              E. Strictly Positive Matrix
     

    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 ton from 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).

    Sample test(s)
    input
    2
    1 0
    0 1
    output
    NO
    input
    5
    4 5 6 1 2
    1 2 3 4 5
    6 4 1 2 4
    1 1 1 1 1
    4 4 4 4 4
    output
    YES

     题意: 矩阵matrix[n][n], 对角线上元素不全为0, 其他元素的值大于等于0. 问是否存在k 使得 矩阵的k次幂之后 元素的值全部大于0.

    设 A = B2  , B 为一邻接矩阵, 则A[i][j] 的实际意义为 从i到j 经过一个点(不包含i, j)的路径的个数。。。对于k次幂就是经过k-1个点的路径的个数了。

     要使 A[i][j] 大于0 ,(有向图) i 到j必须连通。。 A[j][i] > 0 && A[i][j] < 0 ,则i, j之间必能形成回路。

    可以理解为 从任意点开始都可以遍历整个有向图。

    建两个图(正向 反向),分别跑dfs。。判断一下即可。 

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 vector<int>G1[2015];
     4 vector<int>G2[2015];
     5 int  c1, c2;
     6 bool vis[2015];
     7 void dfs1(int r)
     8 {
     9     c1++;
    10     vis[r] = true;
    11     for (int i = 0; i < G1[r].size(); i++)
    12     {
    13         if (!vis[G1[r][i]])
    14             dfs1(G1[r][i]);
    15     }
    16 }
    17 void dfs2(int r)
    18 {
    19     c2++;
    20     vis[r] = true;
    21     for (int i = 0; i < G2[r].size(); i++)
    22     {
    23         if (!vis[G2[r][i]])
    24             dfs2(G2[r][i]);
    25     }
    26 }
    27 int main()
    28 {
    29     #ifndef ONLINE_JUDGE
    30         freopen("in.txt","r",stdin);
    31     #endif
    32     int n;
    33     while (~scanf ("%d", &n))
    34     {
    35         for (int i = 0; i <= n; i++)
    36         {
    37             G1[i].clear();
    38             G2[i].clear();
    39         }
    40         for (int i = 0; i < n; i++)
    41         {
    42             for (int j = 0; j < n; j++)
    43             {
    44                 int x;
    45                 scanf ("%d", &x);
    46                 if (i != j && x)
    47                 {
    48                     G1[i+1].push_back(j+1);
    49                     G2[j+1].push_back(i+1);
    50                 }
    51             }
    52         }
    53         c1 = c2 = 0;
    54         memset(vis, false, sizeof(vis));
    55         dfs1(1);
    56         memset(vis, false, sizeof(vis));
    57         dfs2(1);
    58         printf("%s
    ", (c1 == n && c2 == n) ? "YES" : "NO");
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    后台管理导航栏时间提醒代码。
    关于XML(一)。
    MySQL存储过程之细节
    MySQL存储过程之函数及元数据
    MySQL存储过程之安全策略
    MySQL存储过程之游标
    MySQL存储过程之异常处理
    MySQL存储过程之流程控制
    MySQL存储过程之新sql语句--变量
    MySQL存储过程之参数和复合语句
  • 原文地址:https://www.cnblogs.com/oneshot/p/4415759.html
Copyright © 2011-2022 走看看