Pagini recente » Cod sursa (job #2429569) | Cod sursa (job #178417) | Cod sursa (job #1964532) | Cod sursa (job #1993828) | Cod sursa (job #74714)
Cod sursa(job #74714)
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define Nmax 1001
#define Mmax 10001
int N,M,i,f[Nmax][Nmax],parinte[Nmax],x[Mmax],y[Mmax],aux[Nmax],c,nr;
vector<int> g[Nmax];
void citire()
{
int i;
freopen("critice.in","r",stdin);
scanf("%d %d",&N,&M);
for (i=1;i<=M;++i)
{
scanf("%d %d %d",&x[i],&y[i],&c);
g[x[i]].push_back(y[i]);
g[y[i]].push_back(x[i]);
f[x[i]][y[i]]=f[y[i]][x[i]]=c;
}
}
int bfs()
{
int coada[Nmax],st,dr,aux;
vector<int>::iterator i;
memset(parinte,0,sizeof(parinte));
parinte[coada[st=dr=1]=1]=1;
while ((st<=dr)&&(parinte[N]==0))
{
aux=coada[st];
for (i=g[aux].begin();(i<g[aux].end()) && (parinte[N]==0);++i)
if ((f[aux][*i])&&(parinte[*i]==0))
parinte[coada[++dr]=*i]=aux;
else if (f[aux][*i]==0) g[aux].erase(i--);
++st;
}
return parinte[N];
}
void flux()
{
int cmin,p;
while ( bfs() )
{
cmin=f[N][p=parinte[N]];
while (p!=1)
{
cmin=(f[parinte[p]][p]<cmin?f[parinte[p]][p]:cmin);
p=parinte[p];
}
p=N;
while (p!=1)
{
f[p][parinte[p]]=(f[parinte[p]][p]-=cmin);
p=parinte[p];
}
}
}
void bfs_source()
{
int coada[Nmax],st,dr;
vector<int>::iterator i;
coada[st=dr=1]=1;
memset(parinte,0,sizeof(parinte));
parinte[1]=1;
while (st<=dr)
{
for (i=g[coada[st]].begin();i<g[coada[st]].end();++i)
if ((f[coada[st]][*i]!=0)&&(parinte[*i]==0))
{
parinte[coada[++dr]=*i]=1;
}
++st;
}
}
void bfs_destination()
{
int coada[Nmax],st,dr;
vector<int>::iterator i;
coada[st=dr=1]=N;
aux[N]=1;
while (st<=dr)
{
for (i=g[coada[st]].begin();i<g[coada[st]].end();++i)
if ((f[coada[st]][*i]!=0)&&(aux[*i]==0))
{
aux[coada[++dr]=*i]=1;
}
++st;
}
}
int main()
{
citire();
flux();
bfs_source();
bfs_destination();
freopen("critice.out","w",stdout);
printf(" \n");
for (i=1;i<=M;++i)
if ((f[x[i]][y[i]]==0)&&((parinte[x[i]]+aux[y[i]]==2)||(parinte[y[i]]+aux[x[i]]==2)))
{
printf("%d\n",i);
++nr;
}
fseek(stdout,0,SEEK_SET);
printf("%d",nr);
fclose(stdout);
return 0;
}