zoukankan      html  css  js  c++  java
  • 上白泽慧音

    裸的tarjan。可是我有个问题 
    不知道是数据太水还是我理解错了,我用一个没比字典序的程序竟然AC了,(这说明数据没有多种最大的的,我认为字典序输出是输出字典序小的 ,不是吗? )
    
    下面是加字典序的代码 
    
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,m;
    const int M=200000;
    int head[M],to[M],nex[M];//数组模拟链表 
    int tot;
    int vis[M];
    int zhan[M];
    int t[M],s[M];
    void add(int x,int y)//添加临接点 
    {
        nex[++tot]=head[x];
        to[tot]=y;
        head[x]=tot;
    }
    int num;
    int col[M];
    int dfn[M];
    int low[M];
    int top;
    int numc;
    void tarjan(int x)
    {
        dfn[x]=++num;
        low[x]=num;
        vis[x]=1;
        zhan[++top]=x;
        for(int i=head[x];i;i=nex[i])//枚举临接点 
        {
            int tmp=to[i];
            if(!dfn[tmp])   
            {
                tarjan(tmp);
                low[x]=min(low[x],low[tmp]);
            }
            else
            {
                if(vis[tmp]) low[x]=min(low[x],dfn[tmp]);
            }
        }
        if(low[x]==dfn[x])
        {
            numc++;
            while(zhan[top]!=x)//如果栈顶不为x出栈 
            {
                vis[zhan[top]]=0;
                col[zhan[top]]=numc; 
                t[numc]++;//强联通分量中有几个点
                s[numc]=min(numc,zhan[top]);//每个强联通分量找最小的 
                top--;
            }
            vis[x]=0;
            top--;
            col[x]=numc;
            t[numc]++; 
            s[numc]=min(x,s[numc]);// x出栈 
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        add(x,y);
        if(c==2) add(y,x);
        }
        for(int i=1;i<=n;i++)
        if(!dfn[i])
        tarjan(i);
        int max1=-1;
        int z;
        for(int i=1;i<=numc;i++)
        {
            if(t[i]>max1) max1=t[i],z=i;//找点最多的强联通分量记录下来编号 
        }
        for(int i=1;i<=numc;i++)
        {
            if(t[i]==max1&&s[i]<s[z])z=i;//找字典序最小的 
        }
        printf("%d
    ",t[z]); //输出编号 
        for(int i=1;i<=n;i++)
        if(col[i]==z)
        printf("%d ",i);//输出 
        return 0;
    }
  • 相关阅读:
    KVM使用入门
    虚拟化技术之KVM
    MySQL初始化以及客户端工具的使用
    Python基础数据类型-字典(dict)
    Golang异常处理-panic与recover
    HTML&CSS基础-overflow
    MySQL数据类型以及基本使用详解
    HTML&CSS基础-display和visibility
    golang数据传输格式-序列化与反序列化
    Golang的文件处理方式-常见的读写姿势
  • 原文地址:https://www.cnblogs.com/wspl98765/p/6819882.html
Copyright © 2011-2022 走看看