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

    题目描述

    在幻想乡,上白泽慧音是以知识渊博闻名的老师。春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄。因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点。人间之里由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。

    输入输出格式

    输入格式:

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

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

    输出格式:

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

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

    输入输出样例

    输入样例#1:
    5 5
    1 2 1
    1 3 2
    2 4 2
    5 1 2
    3 5 1
    
    输出样例#1:
    3
    1 3 5
    

    说明

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

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

    裸 tarjan  不懂得可以看这里  tarjan算法详解

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define N 50100
    int topp=0;
    struct sta{
        int sz[100001];
        int top(){return sz[topp];}
        void push(int x){sz[++topp]=x;}
        void pop(){if(topp>0)topp--;}
        int size(){return topp;}
    }stack;
    int n,m;int num=0;
    struct node{
        int v;int next;
    }edge[N*10];
    int dfn[N],low[N],color[N],head[N];bool vis[N];
    void add_edge(int x,int y)
    {
        edge[++num].v=y;edge[num].next=head[x];head[x]=num;
    }
    int cnt,s[N],w;
    void tarjan(int x)
    {
        dfn[x]=++w;
        low[x]=w;
        vis[x]=true;
        stack.push(x);
        vis[x]=1;
        for(int i=head[x];i;i=edge[i].next)
        {
            int v=edge[i].v;
            if(!dfn[v])
            {
                tarjan(v);
                low[x]=min(low[x],low[v]);
            }
            else if(vis[v])low[x]=min(low[x],dfn[v]);
        }
        if(dfn[x]==low[x])
        {
            vis[x]=0;
            color[x]=++cnt;
            s[cnt]++;
            while(stack.top()!=x)
            {
                s[cnt]++;
                color[stack.top()]=cnt;
                vis[stack.top()]=false;
                stack.pop();
            }
            stack.pop();
        }
    }
    int ans=0;
    int main()
    {
        scanf("%d%d",&n,&m);
        int a,b,c;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);add_edge(a,b);
            if(c==2)add_edge(b,a);
        }
        for(int i=1;i<=n;i++)
        {
            if(!dfn[i])tarjan(i);
        }
        int xx;
        for(int i=1;i<=n;i++)
        {
            if(s[color[i]]>ans)
            {
                ans=s[color[i]];
                xx=i;
            }
        }
        printf("%d
    ",ans);
        for(int i=1;i<=n;i++)
        {
            if(color[i]==color[xx])printf("%d ",i);
        }
        return 0;
    }
  • 相关阅读:
    订单管理功能
    商品搜索(关键字模糊搜索、三级分类搜索商品)
    通用脱敏工具类
    商品评论分页查询
    winrar激活
    认识position=fixed
    关于div的居中的问题
    关于图像在网页中显示白边的现象
    jquery 禁止页面滚动-移动端
    chrome 41 空格 &nbsp;
  • 原文地址:https://www.cnblogs.com/sssy/p/7073886.html
Copyright © 2011-2022 走看看