Pagini recente » Profil M@2Te4i | Cod sursa (job #1390140) | Cod sursa (job #2105767) | Cod sursa (job #351569) | Cod sursa (job #1149564)
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define inf 10000000
#define NMax 1005
using namespace std;
int C[NMax][NMax],N,tata[NMax];
int F[NMax][NMax],viz[NMax];
int rch[2][NMax];
queue<int> Q;
vector<int> V[NMax],sol;
vector<pair<int,int> > Mc;
int BF ()
{
int fiu,crt,i;
memset(viz,0,sizeof(viz));
viz[1]=1;
Q.push(1);
while (!Q.empty())
{
crt=Q.front(), Q.pop();
if (crt==N) continue;
for (i=0; i<V[crt].size(); i++)
{
fiu=V[crt][i];
if (viz[fiu] || C[crt][fiu]<=F[crt][fiu]) continue;
Q.push(fiu);
viz[fiu]=1;
tata[fiu]=crt;
}
}
return viz[N];
}
void DF (int nod, int tip)
{
rch[tip][nod]=1;
for (int i=0; i<V[nod].size(); i++)
{
int fiu=V[nod][i];
if (C[nod][fiu]>F[nod][fiu] && !rch[tip][fiu])
Df(fiu,tip);
}
}
int main ()
{
int M,i,x,y,d,nod,pnm,min_flux;
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&N,&M);
for (i=1; i<=M; i++)
{
scanf("%d%d%d",&x,&y,&d);
C[x][y]=C[y][x]=d;
V[x].push_back(y);
V[y].push_back(x);
Mc.push_back(make_pair(x,y));
}
while (BF())
for (i=0; i<V[N].size(); i++)
{
pnm=V[N][i], tata[N]=pnm;
if (!viz[pnm]) continue;
min_flux=inf;
for (nod=N; nod!=1; nod=tata[nod])
if (C[tata[nod]][nod]-F[tata[nod]][nod]<min_flux)
min_flux=C[tata[nod]][nod]-F[tata[nod]][nod];
for (nod=N; nod!=1; nod=tata[nod])
{
F[tata[nod]][nod]+=min_flux;
F[nod][tata[nod]]-=min_flux;
}
}
DF(1,0);
DF(N,1);
for (i=0; i<M; i++)
{
x=Mc[i].first, y=Mc[i].second;
if ((C[x][y]==F[x][y] && rch[0][x] && rch[1][y]) ||
(C[y][x]==F[y][x] && rch[0][y] && rch[1][x]))
sol.push_back(i);
}
printf("%d\n",sol.size());
for (i=0; i<sol.size(); i++)
printf("%d\n",sol[i]+1);
return 0;
}