Pagini recente » Cod sursa (job #3072252) | Cod sursa (job #1117049) | Cod sursa (job #620080) | Cod sursa (job #1008477) | Cod sursa (job #1519579)
#include <fstream>
#include <vector>
#include <string.h>
#include <limits.h>
#include <algorithm>
#define NDIM 1003
#define MDIM 10003
#define INF INT_MAX
#define pb push_back
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int PAR[NDIM],F[NDIM][NDIM],POZ[NDIM][NDIM],C[NDIM][NDIM],Q[NDIM],SOL[10*NDIM],nr,N,M;
bool VIZ[NDIM];
vector <int> G[NDIM];
int BFS()
{
memset(VIZ,0,sizeof(VIZ));
Q[0]=Q[1]=VIZ[1]=1;
int x,nod;
for(int i=1;i<=Q[0];i++)
{
x=Q[i];
if(x==N) continue;
for(size_t j=0;j<G[x].size();j++)
{
nod=G[x][j];
if(C[x][nod]==F[x][nod]||VIZ[nod]) continue;
PAR[nod]=x;
VIZ[nod]=1;
Q[++Q[0]]=nod;
}
}
return VIZ[N];
}
void BFS1()
{
memset(VIZ,0,sizeof(VIZ));
Q[0]=1;
Q[1]=N;
VIZ[N]=1;
int x,nod;
for(int i=1;i<=Q[0];i++)
{
x=Q[i];
if(x==1) break;
for(size_t j=0;j<G[x].size();j++)
{
nod=G[x][j];
if(VIZ[nod]) continue;
if(C[nod][x]==F[nod][x]||C[x][nod]==F[x][nod])
{
SOL[++nr]=POZ[nod][x];
}
else
{
VIZ[nod]=1;
Q[++Q[0]]=nod;
}
}
}
}
int main()
{
int i,a,b,cost,nod,fmin,flow;
fin>>N>>M;
for(i=1;i<=M;i++)
{
fin>>a>>b>>cost;
C[a][b]=C[b][a]=cost;
POZ[a][b]=POZ[b][a]=i;
G[a].pb(b);
G[b].pb(a);
}
for(flow=0;BFS();)
{
for(size_t i=0;i<G[N].size();i++)
{
nod=G[N][i];
fmin = INF;
if(C[PAR[nod]][nod]==F[PAR[nod]][nod]||!VIZ[nod]) continue;
PAR[N]=nod;
for(nod=PAR[N];nod!=1;nod=PAR[nod])
fmin=min(fmin,C[PAR[nod]][nod]-F[PAR[nod]][nod]);
if(fmin==0) continue;
for(nod=PAR[N];nod!=1;nod=PAR[nod])
{
F[PAR[nod]][nod]+=fmin;
F[nod][PAR[nod]]-=fmin;
}
flow+=fmin;
}
}
BFS1();
sort(SOL+1,SOL+nr+1);
fout<<nr<<'\n';
for(i=1;i<=nr;i++)
fout<<SOL[i]<<'\n';
return 0;
}