• [CF] 402 E. Strictly Positive Matrix


    一个矩阵,自乘无限次后能否全为正数?

    如果n比较小,可以二分一下,但是这里n很大,乘一次都无法接受

    可以考虑实际含义:矩阵看成邻接矩阵,那么0就是没有边,其余就是有边。

    我们知道邻接矩阵自乘k次就相当于在原图走k步,无限次后是否有0?也就是图能否强连通。

    判断就好,整个是环的情况题目限制不存在。

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    
    const int MAXN=2048;
    
    struct Edge{
      int next,to;
    }e[MAXN*MAXN*2];
    int ecnt,head[MAXN];
    inline void add(int x,int y){
      e[++ecnt].to = y;
      e[ecnt].next = head[x];
      head[x] = ecnt;
    }
    
    inline int rd(){
      int ret=0,f=1;char c;
      while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
      while(isdigit(c))ret=ret*10+c-'0',c=getchar();
      return ret*f;
    }
    
    int n;
    
    int bl[MAXN],cnt;
    int ins[MAXN],sta[MAXN],top;
    int dfn[MAXN],low[MAXN],tot;
    void tarjan(int x){
      dfn[x]=low[x]=++tot;ins[x]=1;sta[++top]=x;
      for(int i=head[x];i;i=e[i].next){
        int v=e[i].to;
        // cout<<x<<" "<<v<<endl<<endl;
        if(!dfn[v]){
          tarjan(v);
          low[x]=min(low[x],low[v]);
        }else if(ins[v]){
          low[x]=min(low[x],dfn[v]);
        }
      }
      if(dfn[x]==low[x]){
        int elm;cnt++;
        do{
            elm = sta[top--];
            ins[elm] = false;
            bl[elm] = cnt;
        }while(elm != x);
      }
    }
    
    int main(){
      n=rd();int x;
      for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
          if(rd()) add(i,j);
      for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
      if(cnt!=1) return puts("NO"),0;
      puts("YES");
      return 0;
    }

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9279609.html

  • 相关阅读:
    Maven的生命周期
    Spring Framework: @RestController vs @Controller
    HTMl5的sessionStorage和localStorage
    Gradle下载类库源码
    Spring Boot, Java Config
    NodeJS简记
    8 commands to check cpu information on Linux
    守护进程之守护进程的惯例
    守护进程之单实例守护进程
    守护进程之出错记录
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9279609.html
Copyright © 2020-2023  润新知