Pagini recente » Cod sursa (job #1294497) | Cod sursa (job #710868) | Cod sursa (job #2957568) | Cod sursa (job #654759) | Cod sursa (job #2006204)
#include <bits/stdc++.h>
using namespace std;
FILE *fin = fopen("critice.in", "r");
FILE *fout = fopen("critice.out", "w");
int n, m;
vector <int> v[1001];
int flx[1001][1001], cap[1001][1001], fin1[10001];
bool much1[1001];
bool much2[1001];
int A[1001], B[1001];
bool viz[1001];
int pre[1001];
inline bool BFS() {
memset(viz, 0, sizeof(viz));
pre[1] = -1;
viz[1] = 1;
queue <int> q;
q.push(1);
while(!q.empty()) {
int nod = q.front();
q.pop();
if(nod != n) {
for(auto &x : v[nod]) {
if(flx[nod][x] != cap[nod][x] && !viz[x]) {
viz[x] = 1;
pre[x] = nod;
q.push(x);
}
}
}
}
return viz[n];
}
inline void BFS1() {
memset(viz, 0, sizeof(viz));
viz[1] = 1;
queue <int> q;
q.push(1);
while(!q.empty()) {
int nod = q.front();
q.pop();
for(auto &x : v[nod]) if(!viz[x]) {
if(flx[nod][x] == cap[nod][x]) {
much1[x] = 1;
viz[x] = 1;
}
else {
much1[x] = 1;
viz[x] = 1;
q.push(x);
}
}
}
}
inline void BFS2() {
memset(viz, 0, sizeof(viz));
viz[n] = 1;
queue <int> q;
q.push(n);
while(!q.empty()) {
int nod = q.front();
q.pop();
for(auto &x : v[nod]) if(!viz[x]) {
if(flx[nod][x] == cap[nod][x]) {
much2[x] = 1;
viz[x] = 1;
}
else {
much2[x] = 1;
viz[x] = 1;
q.push(x);
}
}
}
}
int main() {
fscanf(fin, "%d%d", &n, &m);
for(int i = 1;i <= m;i++) {
int a, b, c;
fscanf(fin, "%d%d%d", &a, &b, &c);
A[i] = a, B[i] = b;
v[a].push_back(b);
v[b].push_back(a);
cap[a][b] = c;
cap[b][a] = c;
}
int ans = 0;
while(BFS()) {
for(int i = 0;i < v[n].size();i++) {
int x = v[n][i];
if(viz[x] && flx[x][n] != cap[x][n]) {
int flux;
flux = INT_MAX;
int nod = n;
while(nod != 1) {
flux = min(flux, cap[pre[nod]][nod] - flx[pre[nod]][nod]);
nod = pre[nod];
}
if(flux != 0) {
nod = n;
while(nod != 1) {
flx[pre[nod]][nod] += flux;
flx[nod][pre[nod]] -= flux;
nod = pre[nod];
}
}
ans += flux;
}
}
}
BFS1();
BFS2();
int nr = 0;
for(int i = 1;i <= m;i++) {
if ((much1[A[i]] * much2[B[i]] == 1 || much1[B[i]] * much2[A[i]] == 1) && (flx[A[i]][B[i]] == cap[A[i]][B[i]] || flx[B[i]][A[i]] == cap[B[i]][A[i]]) )
fin1[++nr] = i;
}
fprintf(fout, "%d\n", nr);
for(int i = 1;i <= nr;i++)
fprintf(fout, "%d\n", fin1[i]);
fclose(fin);
fclose(fout);
return 0;
}