• Proving Equivalences UVALive


    就是统计入度为0 的点 和 出度为0 的点  输出 大的那一个,,

    若图中只有一个强连通分量 则输出0即可

    和https://www.cnblogs.com/WTSRUVF/p/9301096.html  这题差不多  poj1236

    #include <iostream>
    #include <cstdio>
    #include <sstream>
    #include <cstring>
    #include <map>
    #include <set>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #define rap(a, n) for(int i=a; i<=n; i++)
    #define MOD 2018
    #define LL long long
    #define ULL unsigned long long
    #define Pair pair<int, int>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define _  ios_base::sync_with_stdio(0),cin.tie(0)
    //freopen("1.txt", "r", stdin);
    using namespace std;
    const int maxn = 20005, INF = 0x7fffffff;
    vector<int> G[maxn];
    int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt, in[maxn], out[maxn];
    stack<int> s;
    
    void dfs(int u)
    {
        pre[u] = lowlink[u] = ++dfs_clock;
        s.push(u);
        for(int i=0; i<G[u].size(); i++)
        {
            int v = G[u][i];
            if(!pre[v])
            {
                dfs(v);
                lowlink[u] = min(lowlink[u], lowlink[v]);
            }
            else if(!sccno[v])
                lowlink[u] = min(lowlink[u], pre[v]);
        }
        if(lowlink[u] == pre[u])
        {
            scc_cnt++;
            for(;;)
            {
                int x = s.top(); s.pop();
                sccno[x] = scc_cnt;
                if(x == u) break;
            }
        }
    }
    
    void init()
    {
        dfs_clock = scc_cnt = 0;
        mem(sccno, 0);
        mem(pre, 0);
        mem(out, 0);
        mem(in, 0);
        for(int i=0; i<maxn; i++) G[i].clear();
    }
    
    
    int main()
    {
        int T, n, m;
        scanf("%d", &T);
        while(T--)
        {
            init();
            scanf("%d%d", &n, &m);
            rap(1, m)
            {
                int u, v;
                scanf("%d%d", &u, &v);
                G[u].push_back(v);
       //         G[v].push_back(u);
            }
            rap(1, n)
                if(!pre[i])
                    dfs(i);
            rap(1, n)
            {
                for(int j=0; j<G[i].size(); j++)
                {
                    if(sccno[i] != sccno[G[i][j]])
                        out[sccno[i]]++, in[sccno[G[i][j]]]++;
                }
            }
            if(scc_cnt == 1)
            {
                cout<< '0' <<endl;
                continue;
            }
            int a = 0, b = 0;
            rap(1, scc_cnt)
            {
                if(!in[i])
                    a++;
                if(!out[i])
                    b++;
            }
            cout<< max(a, b) <<endl;
    
        }
    
        return 0;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    JavaScript概述
    JavaScript概述
    python语法基础
    python 网络编程
    python 日志模块
    python 异常处理
    python tricks
    记录_省赛(一)
    异或加密算法
    三目条件运算符
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9361303.html
Copyright © 2020-2023  润新知