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


     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     

    题目描述 Description

          在幻想乡,上白泽慧音是以知识渊博闻名的老师。春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄。因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点。人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记。如果存在由村庄A到达村庄B的通路,那么我们认为可以从村庄A到达村庄B,记为(A,B)。当(A,B)和(B,A)同时满足时,我们认为A,B是绝对连通的,记为<A,B>。绝对连通区域是指一个村庄的集合,在这个集合中任意两个村庄X,Y都满足<X,Y>。现在你的任务是,找出最大的绝对连通区域,并将这个绝对连通区域的村庄按编号依次输出。若存在两个最大的,输出字典序最小的,比如当存在1,3,4和2,5,6这两个最大连通区域时,输出的是1,3,4。 

    输入描述 Input Description

    第1行:两个正整数N,M

    第2..M+1行:每行三个正整数a,b,t, t = 1表示存在从村庄a到b的单向道路,t = 2表示村庄a,b之间存在双向通行的道路。保证每条道路只出现一次。

    输出描述 Output Description

    第1行: 1个整数,表示最大的绝对连通区域包含的村庄个数。

    第2行:若干个整数,依次输出最大的绝对连通区域所包含的村庄编号。

    样例输入 Sample Input

    5 5

    1 2 1

    1 3 2

    2 4 2

    5 1 2

    3 5 1

    样例输出 Sample Output

    3

    1 3 5

    数据范围及提示 Data Size & Hint

    对于60%的数据:N <= 200且M <= 10,000

    对于100%的数据:N <= 5,000且M <= 50,000

    tarjan 模板题

     1 #include <algorithm>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 const int N(5000+15);
     7 const int M(50000+5);
     8 int n,m,u,v,op,ans_num,max_col;
     9 
    10 int head[N],sumedge;
    11 struct Edge
    12 {
    13     int to,next;
    14     Edge(int to=0,int next=0):
    15         to(to),next(next){}
    16 }edge[M<<1];
    17 void ins(int u,int v)
    18 {
    19     edge[++sumedge]=Edge(v,head[u]);
    20     head[u]=sumedge;
    21 }
    22 
    23 int tim,dfn[N],low[N];
    24 int top,Stack[N],instack[N];
    25 int sumcol,col[N],point[N];
    26 void DFS(int now)
    27 {
    28     dfn[now]=low[now]=++tim;
    29     Stack[++top]=now;instack[now]=1;
    30     for(int i=head[now];i;i=edge[i].next)
    31     {
    32         int v=edge[i].to;
    33         if(!dfn[v])  DFS(v),low[now]=min(low[now],low[v]);
    34         else if(instack[v])    low[now]=min(low[now],dfn[v]);
    35     }
    36     if(low[now]==dfn[now])
    37     {
    38         col[now]=++sumcol;
    39         point[sumcol]++;
    40         for(;Stack[top]!=now;top--)
    41         {
    42             int fro=Stack[top];
    43             col[fro]=sumcol;
    44             point[sumcol]++;
    45             instack[fro]=0;
    46         }
    47         top--;instack[now]=0;
    48     }
    49 }
    50 
    51 int main()
    52 {
    53     scanf("%d%d",&n,&m);
    54     for(int i=1;i<=m;i++)
    55     {
    56         scanf("%d%d%d",&u,&v,&op);
    57         if(op==1) ins(u,v);
    58         else ins(u,v),ins(v,u);
    59     }
    60     for(int i=1;i<=n;i++)
    61         if(!dfn[i]) DFS(i);
    62     for(int i=1;i<=sumcol;i++)
    63         if(ans_num<point[i]) max_col=i,ans_num=point[i];
    64     printf("%d
    ",ans_num);
    65     for(int i=1;i<=n;i++)
    66         if(col[i]==max_col) printf("%d ",i);
    67     return 0;
    68 } 
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Individual Method Selection Survey rubric
    Xcode 出现Thread 1: signal SIGABRT
    C/C++生成随机数
    《深入浅出深度学习:原理剖析与python实践》第八章前馈神经网络(笔记)
    操作系统--精髓与设计原理(第八版)第三章复习题答案
    操作系统--精髓与设计原理(第八版)第二章复习题答案
    Python知识点整理
    C++ <queue>用法
    C语言结构体用法
    Mac安装Qt出现错误Could not resolve SDK Path for 'macosx'
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7103487.html
Copyright © 2020-2023  润新知