Pagini recente » Cod sursa (job #928914) | Cod sursa (job #2417294) | Cod sursa (job #1054707) | Cod sursa (job #1093567) | Cod sursa (job #17405)
Cod sursa(job #17405)
#include <fstream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define in "critice.in"
#define out "critice.out"
#define Dim 1002
int c[Dim][Dim], sel[Dim], sel2[Dim], t[10002], q[Dim], s[Dim][Dim];
long f[Dim][Dim], cr[Dim];
int n, m, S, T;
int flow, p;
int q1[10001], q2[10001];
void Read();
int FindPath();
void Augment();
void MaxFlow();
void Solve();
void DF(int nod);
int Minim(int a,int b)
{
if ( a > b ) return b;
return a;
}
int main()
{
Read();
MaxFlow();
return 0;
}
void DF(int nod)
{
sel[nod] = 1;
for ( int i = 1; i <= n; i++ )
{
if ( !sel[i] && s[nod][i] == 1 )
{
if ( c[nod][i] != f[nod][i] && c[nod][i] != f[i][nod] )
{
DF(i);
}
}
}
}
void Read()
{
int x,y,val;
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d%d",&n,&m);
for ( int i = 1; i <= m; i++ )
{
scanf("%d%d%d",&x,&y,&val);
q1[i] = x;
q2[i] = y;
s[x][y] = s[y][x] = 1;
c[x][y] = c[y][x] = val;
}
S = 1;
T = n;
}
void MaxFlow()
{
int k = 0;
while ( FindPath() )
{
Augment();
}
for ( int i = 1; i <= n; i++ )
{
sel[i] = 0;
}
p = 0;
DF(1);
for ( int i = 1; i <= n; i++ )
{
sel2[i] = sel[i];
sel[i] = 0;
}
p = 0;
DF(n);
for ( int i = 1; i <= m; i++ )
{
if ( c[q1[i]][q2[i]] == f[q1[i]][q2[i]] || c[q1[i]][q2[i]] == f[q2[i]][q1[i]] )
{
if ( (sel[q1[i]] == 1 && sel2[q2[i]] == 1) || (sel2[q1[i]] == 1 && sel[q2[i]] == 1))
{
k+=1;
t[k] = i;
}
}
}
printf("%d\n",k);
for ( int i = 1; i <= k; i++ ) printf("%d\n",t[i]);
}
int FindPath()
{
int u,p,i,j;
for ( i = 1; i <= n; i++ )
sel[i] = t[i] = q[i] = cr[i] = 0;
sel[1] = 1;
t[1] = 0;
u = p = 1;
q[u] = 1;
cr[1] = 100001;
while ( p <= u )
{
i = q[p];
for ( j = 1; j <= n; j++ )
{
if ( !sel[j] )
{
if ( c[i][j] > f[i][j] )
{
cr[j] = Minim(c[i][j]-f[i][j],cr[i]);
q[++u] = j;
sel[j] = 1;
t[j] = i;
if ( j == n ) return 1;
}
if ( f[j][i] > 0 )
{
cr[j] = Minim(f[j][i],cr[i]);
q[++u] = j;
sel[j] = 1;
t[j] = -i;
if ( j == n ) return 1;
}
}
}
p++;
}
return 0;
}
void Augment()
{
int i, j;
j = n;
while ( j != S )
{
i = abs(t[j]);
if ( t[j] >= 0 ) f[i][j]+=cr[T];
else f[j][i]-=cr[T];
j = i;
}
// flow+=cr[n];
}