Pagini recente » Cod sursa (job #1382856) | Cod sursa (job #1551252) | Cod sursa (job #2022840) | Istoria paginii utilizator/emil_iulie | Cod sursa (job #2017390)
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1000;
const int MAX_M = 10000;
vector<int> graph[1+MAX_N];
int kappa[1+MAX_N][1+MAX_N], q[1+MAX_N], bestfl[1+MAX_N], papa[1+MAX_N];
bool viz[1+MAX_N];
int mca[MAX_M], mcb[MAX_M];
int flow;
static inline int min(int a, int b) {
if(a < b)
return a;
return b;
}
static inline bool augment(int nod) {
int st, dr;
st = dr = 0;
q[dr++] = 1;
memset(viz + 1, 0, sizeof(bool) * MAX_N);
viz[1] = true;
bestfl[1] = 1000000000;
while(st < dr && !viz[nod]) {
int nod = q[st++];
for(auto it: graph[nod]) {
if(!viz[it] && kappa[nod][it] > 0) {
viz[it] = true;
bestfl[it] = min(bestfl[nod], kappa[nod][it]);
q[dr++] = it;
papa[it] = nod;
}
}
}
if(viz[nod]) {
flow += bestfl[nod];
int i = nod;
while(i != 1) {
int j = papa[i];
kappa[j][i] -= bestfl[nod];
kappa[i][j] += bestfl[nod];
i = j;
}
return true;
}
return false;
}
static inline int maxflow(int n) {
flow = 0;
while(augment(n));
return flow;
}
char col[1+MAX_N];
void color(int nod, int c, bool fromSource) {
col[nod] = c;
for(auto it: graph[nod]) {
if(col[it] == 0 && fromSource && kappa[nod][it] > 0)
color(it, c, fromSource);
else if(col[it] == 0 && !fromSource && kappa[it][nod] > 0)
color(it, c, fromSource);
}
}
int main() {
int n, m, a, b, c, rez;
FILE *fin = fopen("critice.in", "r");
fscanf(fin, "%d%d", &n, &m);
for(int i = 0; i < m; ++i) {
fscanf(fin, "%d%d%d", &a, &b, &c);
mca[i] = a;
mcb[i] = b;
kappa[a][b]+=c;
kappa[b][a]+=c;
graph[a].push_back(b);
graph[b].push_back(a);
}
fclose(fin);
maxflow(n);
color(1, 1, true);
color(n, 2, false);
for(int i = 1; i <= n; ++i)
random_shuffle(graph.begin(), graph.end());
rez = 0;
for(int i = 0; i < m; ++i)
if(col[mca[i]] + col[mcb[i]] == 3)
++rez;
FILE *fout = fopen("critice.out", "w");
fprintf(fout, "%d\n", rez);
for(int i = 0; i < m; ++i)
if(col[mca[i]] + col[mcb[i]] == 3)
fprintf(fout, "%d\n", i + 1);
fclose(fout);
return 0;
}