zoukankan      html  css  js  c++  java
  • POJ 3180 The cow Prom Tarjan基础题

    题目用google翻译实在看不懂

    其实题目意思如下

    给一个有向图,求点个数大于1的强联通分量个数

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<vector>
     5 #include<stack>
     6 #define M 50010
     7 #define N 10010
     8 using namespace std;
     9 int n,m,u,v,head[N],cnt=1,ans,sz[N],belong[N],dfn[N],low[N],indx,tar;
    10 bool inst[N];
    11 stack <int> st;
    12 struct edge
    13 {
    14     int u,v;
    15 }e[M];
    16 void add(int u,int v)
    17 {
    18     e[cnt].v=v;
    19     e[cnt].u=head[u];
    20     head[u]=cnt++;
    21 }
    22 void dfs(int u)
    23 {
    24     dfn[u]=low[u]=++indx;
    25     inst[u]=1;
    26     st.push(u);
    27     for (int i=head[u];i;i=e[i].u)
    28     {
    29     int v=e[i].v;
    30     if(!dfn[v])
    31     {
    32         dfs(v);
    33         low[u]=min(low[u],low[v]);
    34     }
    35     else
    36         if (inst[v])
    37         low[u]=min(low[u],dfn[v]);
    38     }
    39     if (dfn[u]==low[u])
    40     {
    41     tar++;
    42     while (1)
    43     {
    44         int t=st.top();
    45         st.pop(),inst[t]=0;
    46         sz[tar]++;
    47         belong[t]=tar;
    48         if (t==u)
    49         break;
    50     }
    51     }}
    52 int main()
    53 {
    54     scanf("%d%d",&n,&m);
    55     for (int i=1;i<=m;i++)
    56     {
    57     scanf("%d%d",&u,&v);
    58     add(u,v);
    59     }
    60     for (int i=1;i<=n;i++)
    61     if (dfn[i]==0) dfs(i);
    62     for (int i=1;i<=tar;i++)
    63     ans+=sz[i]>1;
    64     printf("%d",ans);
    65     return 0;
    66 }
  • 相关阅读:
    python之set
    python之tuple
    python之list
    python之Number
    LAMP源码安装,搭建zabbix监控
    linux sshd服务
    linux rsync服务
    linux 实时同步inotify
    搭建LNMP;搭建WIKI
    数字,列表,函数
  • 原文地址:https://www.cnblogs.com/mrsheep/p/7840514.html
Copyright © 2011-2022 走看看