Pagini recente » Cod sursa (job #1214754) | Cod sursa (job #476003) | Cod sursa (job #1621770) | Cod sursa (job #1384991) | Cod sursa (job #2695898)
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <bits/stdc++.h>
#define dim 1001
#define dim2 dim*10
using namespace std;
int n, m, c[dim][dim], p[dim], used[dim], vis[dim2];
vector< pair<int, int> > g[dim];
vector<int> sol;
queue<int> q;
void search(int node) {
int i, j, in;
vector< pair<int, int> >::iterator it;
memset(used, 0, sizeof(used));
while (q.size()) q.pop();
q.push(node);
used[node]=1;
while (q.size()) {
i=q.front();
q.pop();
for (it=g[i].begin(); it!=g[i].end(); ++it)
if (!used[it->first]) {
j=it->first;
in=it->second;
if (!c[i][j] || (vis[in] && !c[j][i]))
if (vis[in]) sol.push_back(in);
else vis[in]=1;
else {
used[j]=1;
q.push(j);
}
}
}
}
int bfs() {
int node;
vector< pair<int, int> >::iterator it;
memset(used, 0, sizeof(used));
while (q.size()) q.pop();
q.push(1);
used[1]=1;
while (q.size()) {
node=q.front();
q.pop();
if (node==n) continue;
for (it=g[node].begin(); it!=g[node].end(); ++it)
if (!used[it->first] && c[node][it->first]) {
p[it->first]=node;
used[it->first]=1;
q.push(it->first);
}
}
return used[n];
}
void flow() {
int f, i;
vector< pair<int, int> >::iterator it;
for (; bfs(); )
for (it=g[n].begin(); it!=g[n].end(); ++it) {
p[n]=it->first;
f=1<<30;
for (i=n; i!=1; i=p[i])
if (c[p[i]][i]<f) f=c[p[i]][i];
for (i=n; i!=1; i=p[i]) {
c[p[i]][i]-=f;
c[i][p[i]]+=f;
}
}
}
int main() {
int i, x, y, z;
vector<int>::iterator it;
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for (i=1; i<=m; ++i) {
scanf("%d %d %d\n", &x, &y, &z);
g[x].push_back(make_pair(y, i));
g[y].push_back(make_pair(x, i));
c[x][y]=z;
c[y][x]=z;
}
flow();
search(1);
search(n);
sort(sol.begin(), sol.end());
printf("%d\n", sol.size());
for (it=sol.begin(); it!=sol.end(); ++it)
printf("%d\n", *it);
return 0;
}