题目描述
新牛到部队, 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:
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; }