1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
   | #include <bits/stdc++.h> #define _max(x,y) ((x>y)?x:y) #define _min(x,y) ((x<y)?x:y) using namespace std; typedef long long ll; template<typename T> inline void red(T &x) {     x=0;bool fg=0;char ch=getchar();     while(ch<'0'||ch>'9') {if(ch=='-') fg^=1;ch=getchar();}     while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(T)(ch^48),ch=getchar();     if(fg) x=-x; } template<typename T> bool umax(T &x,T y) {return (x<y)?(x=y,true):(false);} template<typename T> bool umin(T &x,T y) {return (x>y)?(x=y,true):(false);} const int N = 10010; const int M = 14; int head[N],id[N<<1],pnt[N<<1],nxt[N<<1],E; int fa[N][M],far[N],n,m; int tag[N][2],dep[N],flag,bl[N]; struct edge {     int u,v,id; }e[N];int ei; int ans[N],ai; int find(int u) {     return far[u]==u?u:far[u]=find(far[u]); } void adde(int u,int v,int _id) {     E++;pnt[E]=v;nxt[E]=head[u];id[E]=_id;head[u]=E; } void dfs(int u) {     for(int i=1;i<M&&fa[u][i-1];i++) fa[u][i]=fa[fa[u][i-1]][i-1];     for(int i=head[u];i;i=nxt[i]) {         int v=pnt[i];         if(v==fa[u][0]) continue;         fa[v][0]=u;         dep[v]=dep[u]+1;         bl[v]=id[i];         dfs(v);     } } int lca(int u,int v) {     if(find(u)!=find(v)) throw;     if(dep[u]>dep[v]) swap(u,v);     int d=dep[v]-dep[u];     for(int i=0;i<M;i++) if((d>>i)&1) v=fa[v][i];     if(u==v) return u;     for(int i=M-1;i>=0;i--) if(fa[u][i]!=fa[v][i])          v=fa[v][i],u=fa[u][i];     return fa[u][0]; } void solve(int u) {     for(int i=head[u];i;i=nxt[i]) {         int v=pnt[i];         if(v==fa[u][0]) continue;         solve(v);         tag[u][0]+=tag[v][0];         tag[u][1]+=tag[v][1];     }     if(tag[u][1]==flag&&tag[u][0]==0) {         ans[++ai]=bl[u];     } } int main() {     red(n);red(m);     for(int i=1;i<=n;i++) far[i]=i;     for(int i=1;i<=m;i++) {         int u,v;red(u);red(v);         int fu=find(u),fv=find(v);         if(fu!=fv) {             far[fu]=fv;             adde(v,u,i);adde(u,v,i);         }else {             ++ei;e[ei].v=v;e[ei].u=u;e[ei].id=i;         }     }     for(int i=1;i<=n;i++) {         if(fa[i][0]==0) dfs(i);     }     for(int i=1;i<=ei;i++) {         int lc=lca(e[i].u,e[i].v);         int cnt=dep[e[i].u]+dep[e[i].v]-dep[lc]*2+1;         if(cnt&1) flag++,ans[++ai]=e[i].id;         tag[e[i].u][cnt&1]++;         tag[e[i].v][cnt&1]++;         tag[lc][cnt&1]-=2;     }     if(flag>1) ai=0;     for(int i=1;i<=n;i++) {         if(fa[i][0]==0) solve(i);     }     if(flag==0) {         printf("%d\n",m);         for(int i=1;i<=m;i++) printf("%d ",i);     }else {         sort(ans+1,ans+ai+1);            printf("%d\n",ai);         for(int i=1;i<=ai;i++) printf("%d ",ans[i]);     }     return 0; }
   |