Pagini recente » Cod sursa (job #2955279) | Cod sursa (job #620753) | Cod sursa (job #1719179) | Cod sursa (job #2395252) | Cod sursa (job #55076)
Cod sursa(job #55076)
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
enum { maxn = 1024, maxe = 10001, inf = 0x3F3F3F3F };
int n;
int d[maxn][maxn], dorig[maxn][maxn], done[maxn][maxn];
int edge[maxn][maxn]; //which edge is it?
int e;
int ee[maxe][2];
int theflow;
int ans[maxe], w;
void maxflow()
{
int i, maxi, maxf, toadd;
bool v[maxn];
int f[maxn];
int prev[maxn];
theflow = 0;
while(true) //increase flow
{
memset(v, 0, sizeof(v));
memset(f, 0, sizeof(f));
f[0] = inf;
while(true) //find augmenting path
{
//find best node to start with
maxi = -1;
maxf = 0;
for(i = 0; i < n; i++)
if(!v[i] && f[i] > maxf)
{
maxi = i;
maxf = f[i];
}
if(maxi == -1) //Mordor
return;
if(maxi == n - 1) //path done
break;
assert(maxf != 0);
//update neighbors
v[maxi] = true;
for(i = 0; i < n; i++)
if(!v[i] && d[maxi][i])
{
toadd = std::min(maxf, d[maxi][i] - f[i]);
if(f[i] < toadd)
{
assert(toadd >= 0);
f[i] = toadd;
prev[i] = maxi;
}
}
}
//update graph
for(i = n - 1; i != 0; i = prev[i])
{
d[ prev[i] ][i] -= maxf;
d[i][ prev[i] ] += maxf;
assert(d[ prev[i] ][i] >= 0);
}
theflow += maxf;
}
//unreachable
}
int main()
{
int i, tmp, oldflow;
FILE *f = fopen("critice.in", "r");
if(!f) return 1;
fscanf(f, "%d%d", &n, &e);
for(i = 0; i < e; i++)
{
fscanf(f, "%d%d%d", &ee[i][0], &ee[i][1], &tmp);
ee[i][0]--;
ee[i][1]--;
d[ ee[i][0] ][ ee[i][1] ] = tmp;
d[ ee[i][1] ][ ee[i][0] ] = tmp;
edge[ ee[i][0] ][ ee[i][1] ] = i;
edge[ ee[i][1] ][ ee[i][0] ] = i;
}
fclose(f);
f = fopen("critice.out", "w");
if(!f) return 1;
memcpy(dorig, d, sizeof(d));
maxflow();
memcpy(done, d, sizeof(d));
oldflow = theflow;
return 1;
for(i = 0; i < e; i++)
{
if(done[ ee[i][0] ][ ee[i][1] ] == 0 ||
done[ ee[i][1] ][ ee[i][0] ] == 0) //fully used
{
memcpy(d, dorig, sizeof(d)); //copies 1MB everytime
d[ ee[i][0] ][ ee[i][1] ]++;
d[ ee[i][1] ][ ee[i][0] ]++;
maxflow();
assert(theflow >= oldflow);
if(theflow > oldflow)
{
assert(theflow == oldflow + 1);
ans[w++] = i;
}
}
}
fprintf(f, "%d\n", w);
for(i = 0; i < w; i++)
fprintf(f, "%d\n", ans[i] + 1);
fclose(f);
return 0;
}