zoukankan      html  css  js  c++  java
  • CF402E Strictly Positive Matrix 传递闭包用强连通分量判断

    题目链接:http://codeforces.com/problemset/problem/402/E

    /**算法分析:
        这道题考察了图论基本知识,就是传递闭包,可以构图用强联通分量来判断
    */
    #include<bits/stdc++.h>
    #define MAXN 2005
    #define PI acos(-1.0)
    #define REP(i,n) for(int i=0; i<n; i++)
    #define FOR(i,s,t) for(int i=s; i<=t; i++)
    #define mem(a,b)  memset(a,b,sizeof(a))
    #define show(x) { cerr<<">>>"<<#x<<" = "<<x<<endl; }
    #define showtwo(x,y) { cerr<<">>>"<<#x<<"="<<x<<"  "<<#y<<" = "<<y<<endl; }
    using namespace std;
    
    bool G[MAXN][MAXN]; //正向图
    bool rG[MAXN][MAXN]; //反向图
    vector<int> s;
    bool vis[MAXN];
    int n;
    
    void dfs(int u)
    {
        vis[u] = true;
        FOR(i,1,n) if(G[u][i] && !vis[i])
            dfs(i);
        s.push_back(u);
    }
    void rdfs(int u)
    {
        vis[u] = true;
        FOR(i,1,n) if(rG[u][i] && !vis[i])
            rdfs(i);
    }
    bool scc()
    {
        s.clear();
        mem(vis,0); dfs(1);
        FOR(i,2,n) if(!vis[i]) return false;
    
        mem(vis,0); rdfs(s[n-1]);
        for(int i=n-2;i>=0; i--)
            if(!vis[s[i]]) return false;
        return true;
    }
    
    int main()
    {
        //freopen("E:\acm\input.txt","r",stdin);
        mem(G,0); mem(rG,0);
        cin>>n;
        FOR(i,1,n) FOR(j,1,n)
        {
            int a; scanf("%d",&a);
            if(i == j) continue;
            if(a>0) G[i][j] = true,rG[j][i] = true;
        }
        if(scc()) printf("YES
    ");
        else      printf("NO
    ");
    }
    View Code
  • 相关阅读:
    mysql timeout expired处理
    Git学习笔记(0)-错误汇总
    auto_ptr源码剖析
    谈谈工作中遇到的系统优化问题
    js 面向对象
    js API
    js 闭包
    js 重载(overload)
    css 文本单行、多行超出省略
    es6 字符串String的扩展
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3616619.html
Copyright © 2011-2022 走看看