Pagini recente » Algoritmiada 2015 - Clasament Runda 1, Juniori | Istoria paginii utilizator/maricasorin | Statistici Zaharia Horia (zaharia_horia) | Cod sursa (job #1240743) | Cod sursa (job #129621)
Cod sursa(job #129621)
#include<stdio.h>
typedef struct NOD{int x; struct NOD *adr;};
typedef struct {int u,v;}muchie;
FILE *fin,*fout;
muchie *M=new muchie [10005];
int m,n,cap[1005][1005];
int vizitat[1005], coada[1005], prec[1005];
int start,end,nrsol=0,sol[10005];
void adaug_st(NOD *(&prim), int inf)
{NOD *a=new NOD;
a->x=inf;
a->adr=prim;
prim=a;}
void citire(NOD *(&prim)[1005])
{int i;
fin=fopen("critice.in","r");
fscanf(fin,"%d %d",&n,&m);
for(i=0;i<n;i++)
prim[i]=NULL;
for(i=0;i<m;i++)
{int c;
fscanf(fin,"%d %d %d",&M[i].u,&M[i].v,&c);
M[i].u--;
M[i].v--;
adaug_st(prim[M[i].u],M[i].v);
adaug_st(prim[M[i].v],M[i].u);
cap[M[i].u][M[i].v]=cap[M[i].v][M[i].u]=c;}
fclose(fin);}
void bf(NOD *prim[1005])
{int i;
NOD *b;
start=end=0;
for(i=1;i<n;i++)
vizitat[i]=0;
vizitat[0]=1;
coada[0]=0;
prec[0]=-1;
while(start<=end)
{b=prim[coada[start]];
while(b)
{if(!vizitat[b->x] && cap[coada[start]][b->x])
{coada[++end]=b->x;
prec[b->x]=coada[start];
vizitat[b->x]=1;
if(b->x==n-1)
return;}
b=b->adr;}
start++;}}
void edmonds_karp(NOD *prim[1005])
{do{bf(prim);
if(vizitat[n-1])
{int v=n-1,u,min=100000;
while(prec[v]!=-1)
{u=prec[v];
if(cap[u][v]<min)
min=cap[u][v];
v=u;}
v=n-1;
while(prec[v]!=-1)
{u=prec[v];
cap[u][v]-=min;
cap[v][u]+=min;
v=u;}}
}while(vizitat[n-1]);}
void df1(NOD *prim[1005], int varf)
{NOD *b=prim[varf];
while(b)
{if(cap[varf][b->x] && !vizitat[b->x])
{vizitat[b->x]=1;
df1(prim,b->x);}
b=b->adr;}}
void df2(NOD *prim[1005], int varf)
{NOD *b=prim[varf];
while(b)
{if(cap[b->x][varf] && !vizitat[b->x])
{vizitat[b->x]=2;
df2(prim,b->x);}
b=b->adr;}}
void critice(NOD *prim[1005])
{int i;
for(i=0;i<n;i++)
vizitat[i]=0;
vizitat[0]++;
vizitat[n-1]|=2;
df1(prim,0);
df2(prim,n-1);
for(i=0;i<m;i++)
{int u=M[i].u,v=M[i].v;
if(!cap[u][v] && (vizitat[u]&1) && (vizitat[v]>>1))
sol[nrsol++]=i+1;
else if(!cap[v][u] && (vizitat[u]>>1) && (vizitat[v]&1))
sol[nrsol++]=i+1;}}
void scriere_solutie()
{fout=fopen("critice.out","w");
fprintf(fout,"%d\n",nrsol);
for(int i=0;i<nrsol;i++)
fprintf(fout,"%d\n",sol[i]);
fclose(fout);}
int main()
{
NOD *prim[1005];
citire(prim);
edmonds_karp(prim);
critice(prim);
scriere_solutie();
return 0;
}