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

    二次联通门 : luogu P1726 上白泽慧音

    /*
        luogu P1726 上白泽慧音
        
        Tarjan求强连通分量
         
        输出最大强联通分量是什么 
         
    */
    #include <algorithm>
    #include <cstdio>
    #include <stack>
    
    #define Max 5020
    #define INF 1e7
    
    void read (int &now)
    {
        now = 0;
        char word = getchar ();
        while (word > '9' || word < '0')
            word = getchar ();
        while (word >= '0' && word <= '9')
        {
            now = now * 10 + word - '0';
            word = getchar ();
        }
    }
    
    struct Edge
    {
        int to;        
        int next;
    };
        
    int Count;
    int Saber;
        
    std :: stack <int> Stack;
    
    struct Road
    {
        int edge[Max];
        int Count;    
    };
    
    Road road[Max];
    
    Edge edge[Max << 6];
        
    int Edge_Count;
    int edge_list[Max];
        
    inline void AddEdge (int from, int to)
    {
        Edge_Count++;
        edge[Edge_Count].to = to;
        edge[Edge_Count].next = edge_list[from];
        edge_list[from] = Edge_Count;
    }
        
    int father[Max];
    int low[Max];
    int ruri[Max];
    
    void Dfs (int now)
    {
        father[now] = ++Count;
        low[now] = Count;
        Stack.push (now);
        for (int i = edge_list[now]; i; i = edge[i].next)
            if (!father[edge[i].to])
            {
                Dfs (edge[i].to);
                low[now] = low[edge[i].to] < low[now] ? low[edge[i].to] : low[now];
            }
            else if (!ruri[edge[i].to])
                low[now] = father[edge[i].to] < low[now] ? father[edge[i].to] : low[now];
        int x;
        if (low[now] == father[now])
        {
            Saber++;
            x = now + 1;
            while (x != now)
            {
                x = Stack.top ();
                Stack.pop ();
                ruri[x] =  Saber;
                road[Saber].edge[++road[Saber].Count] = x;
            }
        }
    }
    
    int N, M;
    
    int main (int argc, char *argv[])
    {
        read (N);
        read (M);
        int x, y;
        int type;
        int Max_Number = 0;
        int Min_Edge;
        
        for (register int i = 1; i <= M; i++)
        {
            read (x);
            read (y);
            read (type);
            AddEdge (x, y); 
            if (type == 2)
                AddEdge (y, x);    
        }
        int Answer_Count;
        for (int i = 1; i <= N; i++)
            if (!father[i])
                Dfs (i);
        for (int i = 1; i <= Saber; i++)
            std :: sort (road[i].edge + 1, road[i].edge + 1 + road[i].Count);
        int pos;
        for (int i = 1; i <= Saber; i++)
        {
            if (road[i].Count > Max_Number)
            {
                Max_Number = road[i].Count;
                Min_Edge = road[i].edge[1];
                pos = i;
            }
            else if (road[i].edge[1] < Min_Edge && road[i].Count == Max_Number)
            {
                Min_Edge = road[i].edge[1];
                pos = i;
            }
        }
        printf ("%d
    ", road[pos].Count);
        for (int i = 1; i <= road[pos].Count; i++)
            printf ("%d ", road[pos].edge[i]);
        return 0;
    }
  • 相关阅读:
    Fedora安装ati显卡驱动
    [转]SQLite 3入门教程
    [转]QT:不规则窗口的实现
    Ubuntu 10.10可用源
    [转]Qtopia2.2.0移植
    [转]嵌入式Qtopia2.2.0开发环境的搭建和使用
    ES6 find 和 filter 的区别
    “/ArcGIS/rest”应用程序中的服务器错误——解决办法
    Java:String和Date、Timestamp之间的转换
    UVA 100 The 3n+1 Problem
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/7045084.html
Copyright © 2011-2022 走看看