Pagini recente » Cod sursa (job #2653791) | Cod sursa (job #3252085) | Cod sursa (job #1181839) | Cod sursa (job #2154153) | Cod sursa (job #1585426)
#include <fstream>
#include <vector>
#include <string.h>
#include <limits.h>
#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],C[NDIM][NDIM],Q[NDIM],SOL[MDIM],nr,N,M,vx[MDIM],vy[MDIM],p,u;
int i,a,b,cost,nod,fmin,flow,x,y;
bool VIZ[NDIM],VIZN[NDIM];
vector <int> G[NDIM];
int BFS()
{
memset(VIZ,0,sizeof(VIZ));
memset(PAR,0,sizeof(PAR));
p=u=1;
Q[1]=VIZ[1]=1;
int x,nod;
while(p<=u)
{
x=Q[p];
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[++u]=nod;
}
p++;
}
return VIZ[N];
}
void BFSN()
{
Q[1]=N;
VIZN[N]=1;
p=u=1;
int x,nod;
while(p<=u)
{
x=Q[p];
for(size_t j=0;j<G[x].size();j++)
{
nod=G[x][j];
if(VIZN[nod]==0 && C[nod][x]>F[nod][x] )
{
VIZN[nod]=1;
Q[++u]=nod;
}
}
p++;
}
}
int main()
{
fin>>N>>M;
for(i=1;i<=M;i++)
{
fin>>a>>b>>cost;
C[a][b]=C[b][a]=cost;
G[a].pb(b);
G[b].pb(a);
vx[i]=a;
vy[i]=b;
}
for(flow=0;BFS();)
{
for(i=0;i<G[N].size();i++)
{
nod=G[N][i];
fmin = INF;
if(C[nod][N]==F[nod][N]||!VIZ[nod]) continue;
PAR[N]=nod;
fmin=C[nod][N]-F[nod][N];
if(fmin==0) continue;
for(;nod!=1;nod=PAR[nod])
fmin=min(fmin,C[PAR[nod]][nod]-F[PAR[nod]][nod]);
for(nod=N;nod!=1;nod=PAR[nod])
{
F[PAR[nod]][nod]+=fmin;
F[nod][PAR[nod]]-=fmin;
}
flow+=fmin;
}
}
BFSN();
for(i=1;i<=M;i++)
{
x=vx[i];y=vy[i];
if(C[x][y]==F[x][y] || C[y][x]==F[y][x])
{
if((VIZN[x]==1 && VIZ[y]==1)||(VIZN[y]==1 && VIZ[x]==1))
{
SOL[++nr]=i;
}
}
}
fout<<nr<<'\n';
for(i=1;i<=nr;i++)
fout<<SOL[i]<<'\n';
return 0;
}