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\n", road[pos].Count);
    for (int i = 1; i <= road[pos].Count; i++)
        printf ("%d ", road[pos].edge[i]);
    return 0;
}
时间: 2024-11-13 08:49:52

luogu P1726 上白泽慧音的相关文章

洛谷P1726 上白泽慧音

P1726 上白泽慧音 124通过 343提交 题目提供者yeszy 标签图论 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 给两组数据吧! 题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记.如果存在由村庄A到达村庄B的通

P1726 上白泽慧音 tarjan 模板

P1726 上白泽慧音 这是一道用tarjan做的模板,要求找到有向图中最大的联通块. #include <algorithm> #include <iterator> #include <iostream> #include <cstring> #include <cstdlib> #include <iomanip> #include <bitset> #include <cctype> #include

CODEVS——T1332 上白泽慧音 || 洛谷——P1726 上白泽慧音

http://codevs.cn/problem/1332/|| https://www.luogu.org/problem/show?pid=1726#sub 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村

P1726 上白泽慧音

题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记.如果存在由村庄A到达村庄B的通路,那么我们认为可以从村庄A到达村庄B,记为(A,B).当(A,B)和(B,A)同时满足时,我们认为A,B是绝对连通的,记为<A,B>.绝对连通区域是指

洛谷 P1726 上白泽慧音

题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记.如果存在由村庄A到达村庄B的通路,那么我们认为可以从村庄A到达村庄B,记为(A,B).当(A,B)和(B,A)同时满足时,我们认为A,B是绝对连通的,记为<A,B>.绝对连通区域是指

P1726 上白泽慧音(0分)

题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记.如果存在由村庄A到达村庄B的通路,那么我们认为可以从村庄A到达村庄B,记为(A,B).当(A,B)和(B,A)同时满足时,我们认为A,B是绝对连通的,记为<A,B>.绝对连通区域是指

P1726 上白泽慧音 强连通

题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记.如果存在由村庄A到达村庄B的通路,那么我们认为可以从村庄A到达村庄B,记为(A,B).当(A,B)和(B,A)同时满足时,我们认为A,B是绝对连通的,记为<A,B>.绝对连通区域是指

P1726 上白泽慧音 - 强连通分量模板

虽然是模板但是却提醒我有向图一定要试着从每个点出发,不仅仅是因为图不一定连通,更有可能是只从1号点出发哪也去不了的情况 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <stack> using namespace std; #define debug(x) cerr << #x << "

洛谷1726 上白泽慧音

本题地址:http://www.luogu.org/problem/show?pid=1726 题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记.如果存在由村庄A到达村庄B的通路,那么我们认为可以从村庄A到达村庄B,记为(A,B).当