zoukankan      html  css  js  c++  java
  • [poj][2186][Popular Cows]

    题目:http://poj.org/problem?id=2186

    题意:给一张有向图,求一些点的个数,这些点满足其他所有点都能直接或间接指向它。

    方法:tarjan+缩点

    View Code
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <algorithm>

    #define Max(A,B) ((A)>(B)?(A):(B))
    #define Min(A,B) ((A)<(B)?(A):(B))
    #define clr(a,b) memset(a, b, sizeof(a))
    using namespace std;

    const int MAXV = 10000+10;
    const int inf = 0x3f3f3f3f;

    const int N = 10010;
    const int M = 50010;
    int e, ev[M], nxt[M], head[N];
    bool instack[N];
    int dfn[N], low[N], dindex, q[N], ed;
    int belong[N], bcnt;

    int cou[N];
    bool out[N];

    void addedge(int u, int v)
    {
    ev[e] = v; nxt[e] = head[u]; head[u] = e++;
    }

    void tarjan(int u)
    {
    int i, v;
    dfn[u] = low[u] = ++dindex;
    instack[u] = 1;
    q[ed++] = u;
    for (i = head[u]; ~i; i = nxt[i])
    {
    v = ev[i];
    if (!dfn[v])
    {
    tarjan(v);
    low[u] = min(low[u], low[v]);
    }
    else if (instack[v])
    {
    low[u] = min(low[u], dfn[v]);
    }
    }
    if (dfn[u] == low[u])
    {
    do{
    belong[v = q[--ed]] = bcnt;
    instack[v] = 0;
    }while (v != u);
    bcnt++;
    }
    }

    int main()
    {
    //freopen("D:/a.txt", "r", stdin);
    int n, m;
    e = 0;
    clr(head, -1);
    scanf("%d%d", &n, &m);
    for (int i=0; i<m; i++)
    {
    int u, v;
    scanf("%d%d", &u, &v);
    addedge(u-1, v-1);
    }
    ed = bcnt = dindex = 0;
    clr(dfn, 0);
    clr(cou, 0);
    clr(out, false);
    clr(instack, 0);
    for (int i=0; i<n; i++)
    {
    if (!dfn[i]) tarjan(i);
    }
    for (int i=0; i<n; i++)
    {
    cou[belong[i]]++;
    for (int j=head[i]; ~j; j = nxt[j])
    {
    if (belong[i]!=belong[ev[j]])
    {
    out[belong[i]] = true;
    }
    }
    }
    int number = 0, ans = 0;
    for (int i=0; i<bcnt; i++)
    {
    if (!out[i])
    {
    number++;
    ans = cou[i];
    }
    }
    if (number == 1) printf("%d\n", ans);
    else printf("0\n");
    return 0;
    }
  • 相关阅读:
    3-剑指Offer: 连续子数组的最大和
    2-剑指offer: 最小的K个数
    1-剑指offer: 数组中出现次数超过一半的数字
    django中运行定时任务脚本
    django+sqlite进行web开发(二)
    django+sqlite3进行web开发(一)
    TL-WDN5200H无线usb网卡在Linux上的使用
    比较好用的C++11在线编译器
    MarkDown中如何加入上标和下标
    3. 卷积神经网络(CNN)
  • 原文地址:https://www.cnblogs.com/nigel0913/p/2434644.html
Copyright © 2011-2022 走看看