Pagini recente » Cod sursa (job #2735955) | Cod sursa (job #580982) | Cod sursa (job #3174691) | Cod sursa (job #2454812) | Cod sursa (job #1201696)
#include<cstdio>
#include<queue>
#include<cstring>
FILE* in=fopen("critice.in","r");
FILE* out=fopen("critice.out","w");
int nrnod,nrmuc;
const int Q=1001,INF=2000000000;
int mat[Q][Q],flux[Q][Q];
std::queue<int> q;
bool viz[Q];
int pred[Q],nr;
bool bfs()
{
while(!q.empty() )
q.pop();
memset(viz,0,sizeof viz);
q.push(1);
viz[1]=1;
int act;
nr=0;
while(!q.empty() )
{
act=q.front();
q.pop();
for(int i=1; i<nrnod; i++)
{
if(viz[i]==0 && mat[act][i]-flux[act][i]>0)
{
pred[i]=act;
viz[i]=1;
q.push(i);
}
}
if(mat[act][nrnod]-flux[act][nrnod]>0)
{
pred[nrnod]=act;
return 1;
}
}
return 0;
}
int parcurgere()
{
int act=nrnod;
int rez=INF;
while(pred[act]!=0)
{
if(mat[pred[act]][act]-flux[pred[act]][act]<rez)
rez=mat[pred[act]][act]-flux[pred[act]][act];
act=pred[act];
}
return rez;
}
void fluxare(int x)
{
int act=nrnod;
while(pred[act]!=0)
{
flux[pred[act]][act]+=x;
flux[act][pred[act]]-=x;
act=pred[act];
}
}
struct muchie{
int a,b;
bool bun;
}muc[10*Q];
int rez[10*Q];
int main()
{
fscanf(in,"%d%d",&nrnod,&nrmuc);
int a,b,c;
for(int i=1; i<=nrmuc; i++)
{
fscanf(in,"%d%d%d",&a,&b,&c);
mat[a][b]=c;
mat[b][a]=c;
muc[i].a=a;
muc[i].b=b;
}
int min;
while(bfs() )
{
min=parcurgere();
fluxare(min);
}
/*
for(int i=1; i<=nrmuc; i++)
{
mat[muc[i].a][muc[i].b]++;
mat[muc[i].b][muc[i].a]++;
if(bfs())
{
rez[++rez[0]]=i;
}
mat[muc[i].a][muc[i].b]--;
mat[muc[i].b][muc[i].a]--;
}*/
for(int i=0; i<=rez[0]; i++)
fprintf(out,"%d\n",rez[i]);
}