Pagini recente » Cod sursa (job #1281201) | Cod sursa (job #57572) | Cod sursa (job #2258441) | Cod sursa (job #2787494) | Cod sursa (job #388284)
Cod sursa(job #388284)
# include <fstream>
# include <iostream>
# include <algorithm>
using namespace std;
int *a[1003], c[1003][1003], I[1003][1003], t[1003], n, m, critice[1003], nc;
void read ()
{
ifstream fin ("critice.in");
fin>>n>>m;
for (int i=1;i<=n;i++)
{
a[i]=(int *) malloc (4);
a[i][0]=0;
}
int x, y, co;
for (int i=1;i<=m;i++)
{
fin>>x>>y>>co;
a[x][0]++;
a[x]=(int *) realloc (a[x], (a[x][0]+1)*4);
a[x][a[x][0]]=y;
a[y][0]++;
a[y]=(int *) realloc (a[y], (a[y][0]+1)*4);
a[y][a[y][0]]=x;
c[x][y]=co;
c[y][x]=co;
I[x][y]=i;
I[y][x]=i;
}
}
int bfs (int s, int d)
{
int cc[1003], st, dr, k;
st=dr=1;
cc[st]=s;
for (int i=1;i<=n;i++)
t[i]=-1;
t[s]=0;
while (st<=dr)
{
k=cc[st++];
for (int i=1;i<=a[k][0];i++)
if (c[k][a[k][i]]>0 && t[a[k][i]]==-1)
{
cc[++dr]=a[k][i];
t[a[k][i]]=k;
}
if (k==d)
return 1;
}
return 0;
}
void EK ()
{
int cmin;
while (bfs (1, n))
{
cmin=1000000;
for (int i=n;t[i];i=t[i])
if (c[t[i]][i]<cmin)
cmin=c[t[i]][i];
for (int i=n;t[i];i=t[i])
{
c[t[i]][i]-=cmin;
c[i][t[i]]-=cmin;
}
}
}
int bfs1 (int s, int d)
{
int cc[1003], st, dr, k, tt[1003];
st=dr=1;
cc[st]=s;
for (int i=1;i<=n;i++)
tt[i]=-1;
tt[s]=0;
while (st<=dr)
{
k=cc[st++];
for (int i=1;i<=a[k][0];i++)
if (c[k][a[k][i]]>0 && tt[a[k][i]]==-1)
{
cc[++dr]=a[k][i];
tt[a[k][i]]=k;
}
if (k==d)
return 1;
}
return 0;
}
void cauta (int s, int d)
{
int cc[1003], st, dr, k;
for (int i=1;i<=n;i++)
t[i]=-1;
st=dr=1;
cc[st]=s;
t[s]=0;
while (st<=dr)
{
k=cc[st++];
for (int i=1;i<=a[k][0];i++)
if (t[a[k][i]]==-1)
{
t[a[k][i]]=k;
if (c[k][a[k][i]]==0 && bfs1(a[k][i], n) && bfs1 (1, k))
critice[++nc]=I[k][a[k][i]];
if (a[k][i]!=d)
cc[++dr]=a[k][i];
}
}
}
void write ()
{
sort(critice+1, critice+nc+1);
ofstream fout ("critice.out");
fout<<nc<<endl;
for (int i=1;i<=nc;i++)
fout<<critice[i]<<endl;
}
int main ()
{
read ();
EK ();
cauta (1, n);
write ();
return 0;
}