• 洛谷 P1793 跑步_NOI导刊2010提高(04)


    题目描述

    新牛到部队, CG 要求它们每天早上搞晨跑,从A农场跑到B农场。从A农场到B农场中有n-2个路口,分别标上号,A农场为1号, B农场为n号,路口分别为 2 ..n -1 号,从A农场到B农场有很多条路径可以到达,而CG发现有的路口是必须经过的,即每条路径都经过的路口,CG要把它们记录下来,这样CG就可以先到那个路口,观察新牛们有没有偷懒,而你的任务就是找出所有必经路口。

    输入输出格式

    输入格式:

    第一行两个用空格隔开的整数 n ( 3<=n<=2000 )和e ( 1<=e<= 8000 )。

    接下来从第2到第e + 1行,每行两个用空格隔开的整数p和q,表示路口p和q之间有路径直达。

    输入数据保证必经路口一定存在,并且每个路口都和A农场、B农场相连通。

    输出格式:

    第一行一个整数m,表示必经路口的数目。

    第二行按从小到大的顺序依次输出每个必经路口的编号,每两个数之间用一个空格隔开。

    输入输出样例

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





    枚举 并查集

     题目链接

    #include <cstdio>
    #define N 8005
    int n,e,s,fa[N],ans[N];
    struct node {int u,v;} edge[N];
    int find_(int x) {return x==fa[x]?x:fa[x]=find_(fa[x]);}
    int main(int argc,char *argv[])
    {
        scanf("%d%d",&n,&e);
        for(int i=1;i<=e;++i)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            edge[i]=(node){u,v};
        }
        for(int i=2;i<n;++i)
        {
            for(int j=1;j<=n;++j) fa[j]=j;
            for(int j=1;j<=e;++j)
            {
                if(edge[j].u==i||edge[j].v==i) continue;
                int fx=find_(edge[j].u),fy=find_(edge[j].v);
                if(fx==fy) continue;
                fa[fy]=fx;
            }
            if(find_(1)!=find_(n)) ans[++s]=i;
        }
        printf("%d
    ",s);
        for(int i=1;i<=s;++i) printf("%d ",ans[i]);
        return 0;
    }
  • 相关阅读:
    d3js 添加数据
    d3js 画布 概念
    Python中的 socket示例
    swift学习笔记
    加密原理介绍,代码实现DES、AES、RSA、Base64、MD5
    socket编程中客户端常用函数
    WBS 与 甘特图
    C/C++ 数据结构之算法
    Linux集群服务 LVS
    Linux内核架构与底层--读书笔记
  • 原文地址:https://www.cnblogs.com/sy1in/p/7861552.html
Copyright © 2020-2023  润新知