Pagini recente » Cod sursa (job #1803147) | Cod sursa (job #1748790) | Cod sursa (job #3171725) | Cod sursa (job #2449918) | Cod sursa (job #938355)
Cod sursa(job #938355)
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 1005
#define mmax 10005
#define inf 100000
struct muchie{long x, y;};
long n, m, a, b, c, ne, vz[nmax], co[nmax], inc, sf, i, nf, el, t[nmax], vt[nmax], nod, fmin, fluxt, poz, aux, rez[mmax], nrez;
long cap[nmax][nmax], flux[nmax][nmax];
bool aj[5][nmax];
vector <long> ma[nmax];
vector <long> ::iterator it;
muchie v[mmax];
void citire()
{
scanf("%ld %ld",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%ld %ld %ld",&a,&b,&c);
ma[a].push_back(b);
ma[b].push_back(a);
cap[a][b]=cap[b][a]=c;
v[i].x=a; v[i].y=b;
}
}
void bfs()
{
co[1]=inc=sf=1; vz[1]=nf; ne=0;
while (inc<=sf)
{
el=co[inc]; inc++;
if (el==n)
break;
for (it=ma[el].begin();it!=ma[el].end();it++)
if (flux[el][*it]<cap[el][*it])
{
if (vz[*it]<nf)
{
co[++sf]=*it; vz[*it]=nf;
t[*it]=el;
}
if ((*it)==n)
vt[++ne]=el;
}
}
}
void calculare()
{
while (1)
{
nf++; bfs();
if (vz[n]==nf)
for (i=1;i<=ne;i++)
{
t[n]=vt[i];
nod=n; fmin=inf;
while (nod>1)
{
if (fmin>cap[t[nod]][nod]-flux[t[nod]][nod])
fmin=cap[t[nod]][nod]-flux[t[nod]][nod];
nod=t[nod];
if (fmin==0)
break;
}
nod=n; fluxt+=fmin;
if (fmin>0)
while (nod>1)
{
flux[t[nod]][nod]+=fmin;
flux[nod][t[nod]]-=fmin;
nod=t[nod];
}
}
else
break;
}
}
void dfs(long nod)
{
vector <long> ::iterator it;
vz[nod]=nf; aj[poz][nod]=1;
for (it=ma[nod].begin();it!=ma[nod].end();it++)
if (vz[*it]<nf)
{
if (poz==1)
if ((flux[nod][*it]<cap[nod][*it])&&(flux[nod][*it]>=0))
dfs(*it);
if (poz==2)
if ((flux[*it][nod]<cap[*it][nod]) && (flux[*it][nod]>=0))
dfs(*it);
}
}
void rezolvare()
{
nf++; poz=1;
dfs(1);
nf++; poz=2;
dfs(n);
for (i=1;i<=m;i++)
{
if ((aj[1][v[i].x])&&(aj[2][v[i].y])&&(cap[v[i].x][v[i].y]==flux[v[i].x][v[i].y]))
rez[++nrez]=i;
else
{
aux=v[i].x; v[i].x=v[i].y; v[i].y=aux;
if ((aj[1][v[i].x])&&(aj[2][v[i].y])&&(cap[v[i].x][v[i].y]==flux[v[i].x][v[i].y]))
rez[++nrez]=i;
}
}
printf("%ld\n",nrez);
for(i=1;i<=nrez;i++)
printf("%ld\n",rez[i]);
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
citire();
calculare();
rezolvare();
// printf("%ld",fluxt);
return 0;
}