Pagini recente » Cod sursa (job #950216) | Cod sursa (job #1021073) | Cod sursa (job #1608872) | Cod sursa (job #930562) | Cod sursa (job #286262)
Cod sursa(job #286262)
#include <stdio.h>
#include <algorithm>
#define N 1001
using namespace std;
struct nod
{
int inf;
nod *next;
}*sir[N];
int T[N],cp[N][N],F[N][N],coada[N];
int flux,n,m,rez[N],viz[N],num;
void baga(int a,int b)
{
nod *q=new nod;
q->inf=a;
q->next=sir[b];
sir[b]=q;
}
void citire()
{
int a,b,f;
freopen ("critice.in","r",stdin);
freopen ("critice.out","w",stdout);
scanf ("%d %d",&n,&m);
for (int i=0;i<m;i++)
{
scanf ("%d %d %d",&a,&b,&f);
cp[a][b]+=f;
cp[b][a]+=f;
baga(a,b);
baga(b,a);
}
}
int verif()
{
int nr=0;
for (int i=2;i<=n;i++)
T[i]=0;
T[1]=-1;
coada[nr++]=1;
for (int i=0;i<nr;i++)
{
for (nod *q=sir[coada[i]];q;q=q->next)
{
if (T[q->inf])
continue;
if (cp[coada[i]][q->inf]<=F[coada[i]][q->inf])
continue;
T[q->inf]=coada[i];
coada[nr++]=q->inf;
if (q->inf==n)
return 1;
}
}
return 0;
}
void solve()
{
int fl;
while (verif())
{
for (int i=1;i<=n;i++)
{
if (!T[i])
continue;
if (cp[i][n]<=F[i][n])
continue;
fl=cp[i][n]-F[i][n];
int nod=i;
while (nod!=1)
{
if (fl>cp[T[nod]][nod]-F[T[nod]][nod])
{
fl=cp[T[nod]][nod]-F[T[nod]][nod];
if (!viz[T[nod]])
{
rez[num++]=T[nod];
viz[T[nod]]=1;
}
}
nod=T[nod];
}
if (!fl)
continue;
F[i][n]+=fl;
F[n][i]-=fl;
nod=i;
while (nod!=1)
{
F[T[nod]][nod]+=fl;
F[nod][T[nod]]-=fl;
nod=T[nod];
}
}
}
}
int main ()
{
citire();
solve();
sort(rez,rez+num);
printf("%d\n",num);
for (int i=0;i<num;i++)
printf("%d\n",rez[i]);
return 0;
}