洛谷 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\n",s);
    for(int i=1;i<=s;++i) printf("%d ",ans[i]);
    return 0;
}

 

 

posted @ 2017-11-19 20:30  PlayAgain  阅读(195)  评论(0编辑  收藏  举报