Pagini recente » Cod sursa (job #2563349) | Cod sursa (job #2316856) | Cod sursa (job #196853) | Cod sursa (job #851164) | Cod sursa (job #2017395)
#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], 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;
}
void pump(int nod) {
int i = nod, cant = 1000000000;
while(i != 1) {
int j = papa[i];
cant = min(cant, kappa[j][i]);
i = j;
}
flow += cant;
i = nod;
while(i != 1) {
int j = papa[i];
kappa[j][i] -= cant;
kappa[i][j] += cant;
i = j;
}
}
static inline bool augment(int dest) {
int st, dr;
bool pompat = false;
st = dr = 0;
q[dr++] = 1;
memset(viz + 1, 0, sizeof(bool) * MAX_N);
viz[1] = true;
while(st < dr) {
int nod = q[st++];
for(auto it: graph[nod]) {
if(!viz[it] && it != dest && kappa[nod][it] > 0) {
viz[it] = true;
q[dr++] = it;
papa[it] = nod;
} else if(it == dest && kappa[nod][it] > 0) {
pompat = true;
papa[dest] = nod;
pump(dest);
}
}
}
return pompat;
}
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[i].begin(), graph[i].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;
}