zoukankan      html  css  js  c++  java
  • tarjan

    #include <bits/stdc++.h>
    #define MAXN 400010
    using namespace std;
    vector<int>v[MAXN];
    bool sign[MAXN];
    int dfn[MAXN],low[MAXN];
    pair<int,int>belong[MAXN];
    int num=0;
    int tot=0;
    int curr=0;
    stack<int>sta;
    void tarjan(int a/*,int pre*/)
    {
        sta.push(a);
        sign[a]=true;
        dfn[a]=low[a]=++curr;
        for(int i=0;i<v[a].size();i++)
        {
            int b=v[a][i];
            if(!sign[b])
            {
                tarjan(b/*,a*/);
                low[a]=min(low[a],low[b]);
            }
            else //if(b!=pre)
                low[a]=min(low[a],dfn[b]);//感觉这地方的dfn[b]可以替换成low[b]
        }
        if(dfn[a]==low[a])
        {
            while(sta.top()!=a)
            {
                belong[num++]=make_pair(sta.top(),tot);
                sta.pop();
            }
            belong[num++]=make_pair(sta.top(),tot++);
            sta.pop();
        }
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int a,b;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            v[a].push_back(b);
        }
        for(int i=1;i<=n;i++)
            if(!sign[i])
                tarjan(i/*,i*/);
        if(n)
            printf("%d",belong[0].first);
        for(int i=1;i<num;i++)
        {
            if(belong[i].second==belong[i-1].second)
                printf(" %d",belong[i].first);
            else printf("
    %d",belong[i].first);
        }
        if(n)
            printf("
    ");
        return 0;
    }

    如果去掉注释符号就是双向边的.

  • 相关阅读:
    EL表达式(Expression Language)
    JSP简单功能介绍
    MySQL基础使用
    JDBC
    MySQL安装卸载
    stanfordnlp dependencies(依存关系简写表)
    不需要深度学习就能做的文本分类器
    词向量的cbow模型
    pytorch实现自己的textCNN
    OpenCV编译viz模块
  • 原文地址:https://www.cnblogs.com/lthb/p/6031468.html
Copyright © 2011-2022 走看看