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
原文地址:https://www.cnblogs.com/acmdeweilai/p/3616619.html