zoukankan      html  css  js  c++  java
  • Tarjan缩点【模板】

     1 #include <algorithm>
     2 #include <cstdio>
     3 #include <map>
     4 
     5 using namespace std;
     6 
     7 const int N(100015);
     8 map<int,bool>Map[N];
     9 int n,m,v,u;
    10 int edgesum,head[N];
    11 int edgesum2,head2[N];
    12 
    13 struct Edge
    14 {
    15     int from,to,next;
    16     Edge(int from=0,int to=0,int next=0) :
    17         from(from),to(to),next(next) {}
    18 }edge[N],edge2[N];
    19 int ins(int from,int to)
    20 {
    21     edge[++edgesum]=Edge(from,to,head[from]);
    22     return head[from]=edgesum;
    23 }
    24 
    25 int ins2(int from,int to)
    26 {
    27     edge2[++edgesum2]=Edge(from,to,head2[from]);
    28     return head2[from]=edgesum2;
    29 }
    30 
    31 int dfn[N],tim,low[N],vis[N];
    32 int Stack[N],top,instack[N];
    33 int col[N],colsum;
    34 
    35 void DFS(int now)
    36 {
    37     dfn[now]=low[now]=++tim; vis[now]=1;
    38     Stack[++top]=now; instack[now]=1;
    39     for(int i=head[now];i;i=edge[i].next)
    40     {
    41         int to=edge[i].to;
    42         if(instack[to]) low[i]=min(low[i],dfn[to]);
    43         else if(!vis[to])
    44                 DFS(to),low[i]=min(low[i],low[to]);
    45     }
    46     if(low[now]==dfn[now])
    47     {
    48         colsum++;
    49         col[now]=colsum;
    50         for(;Stack[top]!=now;top--)
    51         {
    52             col[Stack[top]]=colsum;
    53             instack[Stack[top]]=0;
    54         }
    55         instack[now]=0;
    56         top--;
    57     }
    58 }
    59 
    60 int main()
    61 {
    62     scanf("%d%d",&n,&m);
    63     for(;m--;)
    64     {
    65         scanf("%d%d",&u,&v);
    66         ins(u,v);
    67     }
    68     for(int i=1;i<=n;i++)
    69         if(!vis[i]) DFS(i);
    70     for(int i=1;i<=n;i++)
    71       for(int u=head[i];u;u=edge[i].next)
    72       {
    73           int v=edge[i].to;
    74             if(col[i]!=col[v])
    75                 if(Map[col[i]].find(col[v])==Map[col[i]].end())
    76                 {
    77                     Map[col[i]][col[v]]=1;
    78                     ins2(col[i],col[v]);
    79             }
    80       }
    81     return 0;
    82 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    LINQ Provider表达式树6
    asp.net Forms 验证No.3
    三种用户验证No.1 asp.net Forms
    LinQ表达式目录2
    将ASP.NET MVC 2.0 部署在IIS6和IIS7上
    LINQ Provider 表达式树 5
    asp.net Forms验证No.2
    LINQ表达式树4
    LINQ表达式树3
    绝对精华win8如何使用,玩转win8看完绝不后悔
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6822526.html
Copyright © 2011-2022 走看看