Pagini recente » Cod sursa (job #1603848) | Cod sursa (job #1103514) | Cod sursa (job #589660) | Cod sursa (job #489848) | Cod sursa (job #42764)
Cod sursa(job #42764)
# include <stdio.h>
# include <stdlib.h>
const long int MAXN=1000;
const long int MAXM=10000;
typedef struct MUCHIE {long int a,b,cost;};
MUCHIE muc[MAXM+1];
long int ladiac[MAXN+1][MAXN+1];
long int a[MAXN+1][MAXN+1],m,n;
typedef struct NODC {long int nod,tata;};
int sel_mark[MAXN+1];
void add(long int loc, long int nod) {ladiac[loc][++ladiac[loc][0]]=nod;}
void citire()
{
FILE *f=fopen("critice.in","r");
fscanf(f,"%ld%ld",&n,&m);
long int i,aa,bb,cc;
for (i=1;i<=m;i++)
{
fscanf(f,"%ld%ld%ld",&aa,&bb,&cc);
muc[i].a=aa;muc[i].b=bb;muc[i].cost=cc;
add(aa,bb);
add(bb,aa);
a[aa][bb]=a[bb][aa]=cc;
}
fclose(f);
}
long int bfs(NODC c[], long int &ultim)
{
long int prim=1;
c[++ultim].nod=1;
c[ultim].tata=0;
int sel[MAXN+1]={0};
long int p;
sel[1]=1;
while (prim<=ultim&&!sel[n])
{
p=1;
while (p<=ladiac[c[prim].nod][0])
{
if (a[c[prim].nod][ladiac[c[prim].nod][p]]&&!sel[ladiac[c[prim].nod][p]])
{
c[++ultim].nod=ladiac[c[prim].nod][p];
c[ultim].tata=prim;
sel[c[ultim].nod]=1;
if (sel[n]) break;
}
p++;
}
if (sel[n]) break;
prim++;
}
if (!sel[n]) return 0;
return 1;
}
long int find_min(NODC c[], long int ultim)
{
long int tat=c[ultim].tata,min=100000;
while (tat)
{
if (min>a[c[tat].nod][c[ultim].nod]) min=a[c[tat].nod][c[ultim].nod];
ultim=tat;
tat=c[ultim].tata;
}
return min;
}
void saturate(long int min, NODC c[], long int ultim)
{
long int tat=c[ultim].tata;
while (tat)
{
a[c[tat].nod][c[ultim].nod]-=min;
a[c[ultim].nod][c[tat].nod]+=min;
ultim=tat;
tat=c[ultim].tata;
}
}
void det_max_flow()
{
long int ultim,ok,min;
NODC coada[MAXN+1];
do
{
ultim=0;
ok=bfs(coada,ultim);
if (!ok) break;
min=find_min(coada,ultim);
saturate(min,coada,ultim);
}
while(ok);
}
void bfs2(long int sursa, int mark)
{
long int prim=1,ultim=1;
NODC c[MAXN+1];
c[1].nod=sursa;
c[1].tata=0;
long int p;
sel_mark[sursa]=mark;
while (prim<=ultim)
{
p=1;
while (p<=ladiac[c[prim].nod][0])
{
if (a[c[prim].nod][ladiac[c[prim].nod][p]]&&!sel_mark[ladiac[c[prim].nod][p]])
{
c[++ultim].nod=ladiac[c[prim].nod][p];
c[ultim].tata=prim;
sel_mark[c[ultim].nod]=mark;
}
p++;
}
prim++;
}
}
void scrie()
{
FILE *g=fopen("critice.out","w");
long int nr=0,i;
for (i=1;i<=m;i++)
if (sel_mark[muc[i].a]*sel_mark[muc[i].b]==2) nr++;
fprintf(g,"%ld\n",nr);
for (i=1;i<=m;i++)
if (sel_mark[muc[i].a]*sel_mark[muc[i].b]==2)
fprintf(g,"%ld\n",i);
fcloseall();
}
int main()
{
citire();
det_max_flow();
bfs2(1,1);
bfs2(n,2);
scrie();
return 0;
}