Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- typedef long long ll;
- #define pii pair<int, int>
- #define fs first
- #define sc second
- #define pb push_back
- #define mp make_pair
- const int N = 105;
- const int INF = 2e9 + 5;
- struct edge {
- int u, v, p;
- edge *rev;
- edge(){}
- edge(int u, int v, int p, edge* rev = nullptr) {
- this->u = u;
- this->v = v;
- this->p = p;
- this->rev = rev;
- }
- };
- vector<edge*> g[N];
- edge* ed[N * N];
- int dist[N], cnt[N], n, m;
- vector<bool> vis(N);
- queue<int> q;
- bool bfs(int v, int u) {
- fill(vis.begin(), vis.end(), false);
- q.push(v);
- vis[v] = true;
- dist[v] = 0;
- while(!q.empty()) {
- int v = q.front();
- q.pop();
- for (int i = 0; i < g[v].size(); i++) {
- int to = g[v][i]->v;
- if (vis[to] || g[v][i]->p == 0)
- continue;
- vis[to] = true;
- dist[to] = dist[v] + 1;
- q.push(to);
- }
- }
- return vis[u];
- }
- bool dfs(int v, int fn, int flow) {
- if (v == fn)
- return true;
- for (int i = cnt[v]; i < g[v].size(); i++, cnt[v]++) {
- if (g[v][i]->p == 0 || dist[g[v][i]->v] != dist[v] + 1)
- continue;
- if (dfs(g[v][i]->v, fn, 1)) {
- g[v][i]->p = 0;
- g[v][i]->rev->p = 1;
- return true;
- }
- }
- return false;
- }
- inline int getFlow(int u, int v) {
- int res = 0;
- while(bfs(u, v)) {
- for (int i = 0; i < n; i++)
- cnt[i] = 0;
- while(dfs(u, v, 1))
- res++;
- }
- for (int i = 0; i < m; i++) {
- if (ed[i]->p == 0 && ed[i]->rev->p == 1) {
- ed[i]->p = 1;
- ed[i]->rev->p = 0;
- }
- }
- return res;
- }
- signed main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int tests;
- cin >> tests;
- while(tests--) {
- cin >> n >> m;
- for (int i = 0; i < n; i++)
- g[i].clear();
- for (int i = 0; i < m; i++) {
- int u, v;
- cin >> u >> v;
- u--, v--;
- g[u].pb(new edge(u, v, 1));
- g[v].pb(new edge(v, u, 0, g[u].back()));
- g[u].back()->rev = g[v].back();
- ed[i] = g[u].back();
- }
- pii good_pair;
- int ans = INF;
- for (int u = 0; u < n; u++) {
- for (int v = 0; v < n; v++) {
- if (u == v)
- continue;
- int res = getFlow(u, v);
- if (res < ans) {
- ans = res;
- good_pair = mp(u, v);
- }
- }
- }
- cout << ans << endl;
- int u = good_pair.fs, v = good_pair.sc;
- for (int i = 0; i < m; i++) {
- ed[i]->p = 0;
- if (getFlow(u, v) == ans - 1) {
- ans--;
- cout << i + 1 << " ";
- }
- else
- ed[i]->p = 1;
- }
- cout << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement