Pagini recente » Cod sursa (job #2722350) | Cod sursa (job #1626351) | Cod sursa (job #1405834) | Cod sursa (job #3153536) | Cod sursa (job #989631)
Cod sursa(job #989631)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 1003;
#define FILEIN "critice.in"
#define FILEOUT "critice.out"
vector<int> A[NMAX];
int cap[NMAX][NMAX];
int flow[NMAX][NMAX];
int t[NMAX];
int N, M, R1[NMAX], RN[NMAX];
bool mark[NMAX];
vector<pair<int, int> > muchii;
vector<int> sol;
bool bfs() {
queue<int> Q;
memset(mark, 0, sizeof(mark));
Q.push(1);
while(!Q.empty()) {
int nod = Q.front(); Q.pop();
if ( nod == N ) continue;
for ( size_t j = 0; j < A[nod].size(); j++) {
int next = A[nod][j];
if (cap[nod][next] == flow[nod][next] || mark[next]) continue;
mark[next] = 1;
Q.push(next);
t[next] = nod;
}
}
return mark[N];
}
int detfmin(int nod) {
int f = 0x3f3f3f3f;
for ( nod = N; nod != 1; nod = t[nod]) {
f = min(f, cap[t[nod]][nod] - flow[t[nod]][nod]);
}
return f;
}
void rmfmin(int nod, int f) {
for ( nod = N; nod != 1; nod = t[nod]) {
flow[t[nod]][nod] += f;
flow[nod][t[nod]] -= f;
}
}
void bfs2() {
queue<int> Q;
memset(R1, 0, sizeof(R1));
R1[1] = true;
Q.push(1);
while (!Q.empty()) {
int nod = Q.front(); Q.pop();
for ( size_t j = 0; j < A[nod].size(); j++) {
int next = A[nod][j];
if (cap[nod][next] != max(flow[nod][next], flow[next][nod]) && !R1[next]) {
R1[next] = 1;
Q.push(next);
}
}
}
}
void bfs3() {
queue<int> Q;
memset(RN, 0, sizeof(RN));
Q.push(N);
RN[N] = true;
while (!Q.empty()) {
int nod = Q.front(); Q.pop();
for ( size_t j = 0; j < A[nod].size(); j++) {
int next = A[nod][j];
if (cap[nod][next] != max(flow[nod][next], flow[next][nod]) && !RN[next]) {
RN[next] = 1;
Q.push(next);
}
}
}
}
int main() {
freopen(FILEIN, "r", stdin);
freopen(FILEOUT, "w", stdout);
scanf("%d %d", &N, &M);
for ( int i = 1, x, y, z; i <= M; i++ ) {
scanf("%d %d %d", &x, &y, &z);
cap[x][y] = z;
cap[y][x] = z;
A[x].push_back(y);
A[y].push_back(x);
muchii.push_back(make_pair(x,y));
}
/** Flux */
while(bfs()) {
for ( int i = 0; i < A[N].size(); i++) {
int nod = A[N][i];
if (flow[nod][N] == cap[nod][N] || !mark[nod]) continue;
t[N] = nod;
int fminim = detfmin(nod);
if (!fminim)
continue;
rmfmin(nod, fminim);
}
}
bfs2();
bfs3();
for ( int i = 0, x, y; i < muchii.size(); i++ ) {
x = muchii[i].first;
y = muchii[i].second;
if (max(flow[x][y], flow[y][x]) == cap[x][y]) {
if ( (R1[x] && RN[y]) || (RN[x] && R1[y]) )
sol.push_back(i+1);
}
}
printf("%d\n", sol.size());
for ( int i = 0; i < sol.size(); i++) {
printf("%d\n", sol[i]);
}
return 0;
}