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
| #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; const int MAXN = 1e4 + 5;
int n, m, tot, cut, col[MAXN], dep[MAXN], sum1[MAXN], sum2[MAXN], ind[MAXN]; vector<int> ans;
struct Edge { int v, id; Edge() {} Edge(int V, int Id) { v = V, id = Id; } }; vector<Edge> G[MAXN];
void paint(int u, int c, int fa) {
col[u] = c; dep[u] = dep[fa] + 1;
for (int i = 0; i < G[u].size(); i++) { int v = G[u][i].v;
if (!col[v]) { paint(v, col[u] * -1, u); ind[v] = G[u][i].id; sum1[u] += sum1[v]; sum2[u] += sum2[v]; } else if (dep[v] < dep[u] - 1) { if (col[v] == col[u]) cut = G[u][i].id, sum1[u]++, sum1[v]--, tot++; else sum2[u]++, sum2[v]--; }
} }
int main() {
scanf("%d %d", &n, &m); for (int i = 1, u, v; i <= m; i++) { scanf("%d %d", &u, &v); G[u].push_back(Edge(v, i)); G[v].push_back(Edge(u, i)); }
for (int i = 1; i <= n; i++) if (!col[i]) paint(i, 1, 0);
if (tot == 0) { printf("%d\n", m); for (int i = 1; i <= m; i++) printf("%d ", i); return 0; }
if (tot == 1) { ans.push_back(cut); }
for (int i = 1; i <= n; i++) if (sum1[i] == tot && !sum2[i]) { ans.push_back(ind[i]); }
sort(ans.begin(), ans.end()); ans.resize(unique(ans.begin(), ans.end()) - ans.begin());
printf("%d\n", ans.size()); for (int i = 0; i < ans.size(); i++) { printf("%d ", ans[i]); }
return 0; }
|