Pagini recente » Cod sursa (job #375571) | Cod sursa (job #2881392) | Cod sursa (job #349375) | Cod sursa (job #1683904) | Cod sursa (job #148022)
Cod sursa(job #148022)
#include<stdio.h>
long n,m,grad[1001],x[10001],y[10001],cp[1001][1001],fl[1001][1001],
*vec[1001],h[1001],e[1001];
void citire();
void flux();
void conex1();
void conex2();
void afisare();
int main()
{
citire();
flux();//algoritmul cu preflux
conex1();//noduri conectate la sursa in reteaua reziduala
conex2();//noduri conectate la destinatie in reteaua reziduala
afisare();
return 0;
}
void citire()
{ long i,xx,yy,cc;
FILE *f=fopen("critice.in","r");
fscanf(f,"%ld%ld",&n,&m);//n=nr varfuri;m=nr muchii;
for(i=1;i<=m;i++)
{ fscanf(f,"%ld%ld%ld",&xx,&yy,&cc);
grad[xx]++;grad[yy]++;x[i]=xx;y[i]=yy;
cp[xx][yy]=cp[yy][xx]=cc;
}//citire muchii si capacitati;calcul grade varfuri;
for(i=1;i<=n;i++)
{ vec[i]=new long [grad[i]+2];
vec[i][grad[i]+1]=0;
grad[i]=0;
}//alocare spatiu pt lista vecini;
for(i=1;i<=m;i++)
{ vec[x[i]][++grad[x[i]]]=y[i];
vec[y[i]][++grad[y[i]]]=x[i];
}//creare lista vecini
fclose(f);
}
void flux()
{ long i,j,k,push,lift,hmin,f0;
h[1]=n;
for(i=1;i<=grad[1];i++)
{j=vec[1][i];fl[1][j]=cp[1][j];fl[j][1]=-cp[1][j];e[j]=cp[1][j];}
i=0;
while(i!=n)
{ for(i=2;i<n;i++)
if(e[i]>0)
{ push=0;lift=0;hmin=2*n;
for(k=1;k<=grad[i];k++)
{ j=vec[i][k];
if(cp[i][j]>fl[i][j])
{ lift++;
if(h[i]==h[j]+1)
{ f0=(e[i]<cp[i][j]-fl[i][j])?e[i]:cp[i][j]-fl[i][j];
fl[i][j]+=f0;fl[j][i]=-fl[i][j];
e[i]-=f0;e[j]+=f0;
push=1;
}
else
if(h[j]<hmin)hmin=h[j];
}
if(push)break;
}
if(push)break;
if(lift){h[i]=hmin+1;break;}
}
}
}
void conex1()
{ long i,first,last,ii,jj,nv,coada[1001];
for(i=1;i<=n;i++)e[i]=0;e[1]=1;
first=1;last=1;coada[1]=1;
while(first<=last)
{ ii=coada[first];
nv=grad[ii];
for(i=1;i<=nv;i++)
{ jj=vec[ii][i];
if(e[jj])continue;
if(cp[ii][jj]<=fl[ii][jj])continue;
coada[++last]=jj;
e[jj]=1;
}
first++;
}
}
void conex2()
{ long i,first,last,ii,jj,nv,coada[1001];
e[n]=2;
first=1;last=1;coada[1]=n;
while(first<=last)
{ ii=coada[first];
nv=grad[ii];
for(i=1;i<=nv;i++)
{ jj=vec[ii][i];
if(e[jj])continue;
if(cp[jj][ii]<=fl[jj][ii])continue;
coada[++last]=jj;
e[jj]=2;
}
first++;
}
}
void afisare()
{ long i,sol=0;
FILE *f=fopen("critice.out","w");
for(i=1;i<=m;i++)
if(e[x[i]]+e[y[i]]==3)sol++;
fprintf(f,"%ld\n",sol);
for(i=1;i<=m;i++)
if(e[x[i]]+e[y[i]]==3)
fprintf(f,"%ld\n",i);
fclose(f);
}