Pagini recente » Cod sursa (job #10812) | Cod sursa (job #2502550) | Cod sursa (job #288701) | Cod sursa (job #836644) | Cod sursa (job #1468117)
#include <fstream>
#include <cstdio>
#include <vector>
#include <memory.h>
#define NMAX 1002
#define INF 9999999999
using namespace std;
ofstream fout("critice.out");
int co[NMAX],ANT[NMAX],C[NMAX][NMAX],F[NMAX][NMAX],sol[NMAX];
bool viz[NMAX];
int n,m,nrNod;
struct drum{int nod1,nod2,limit;} muchie[10003];
vector<int> G[NMAX];
void read()
{
freopen("critice.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&muchie[i].nod1,&muchie[i].nod2,&muchie[i].limit);
G[muchie[i].nod1].push_back(muchie[i].nod2);
G[muchie[i].nod2].push_back(muchie[i].nod1);
C[muchie[i].nod1][muchie[i].nod2] = muchie[i].limit;
C[muchie[i].nod2][muchie[i].nod1] = muchie[i].limit;
}
}
bool BFS()
{
int sf =1 , nod;
co[1]=1;
memset(viz,0,sizeof(viz));
viz[1]=1;
for(int inc = 1;inc<=sf;inc++)
{
nod = co[inc];
if(nod == n)
return 1;
for(int i=0;i<G[nod].size();i++)
{
if(viz[G[nod][i]] || C[nod][G[nod][i]] == F[nod][G[nod][i]]) continue;
viz[G[nod][i]] = 1;
ANT[G[nod][i]] = nod;
co[++sf] = G[nod][i];
}
}
return 0;
}
void createFlux()
{
int nod, flux;
while(BFS())
for(int i=0;i<G[n].size();i++)
{
nod = G[n][i];
if(!viz[nod] || C[nod][n] == F[nod][n]) continue;
ANT[n]= nod;
flux = INF;
for(int i=n;i>1;i = ANT[i])
flux = min(flux, C[ANT[i]][i] - F[ANT[i]][i]);
if(flux == 0) continue;
for(int i=n;i>1;i=ANT[i])
F[ANT[i]][i] = F[i][ANT[i]] = F[ANT[i]][i] + flux;
}
}
void solve()
{
for(int i=1;i<=m;i++)
{
if(C[muchie[i].nod1][muchie[i].nod2] > F[muchie[i].nod1][muchie[i].nod2])
{
C[muchie[i].nod1][muchie[i].nod2] = C[muchie[i].nod2][muchie[i].nod1] = muchie[i].limit + 1;
if(BFS())
sol[++nrNod] = i;
C[muchie[i].nod1][muchie[i].nod2] = C[muchie[i].nod2][muchie[i].nod1] = muchie[i].limit;
}
}
}
void afis()
{
fout<<nrNod<<'\n';
for(int i=1;i<=nrNod;i++)
fout<<sol[i]<<'\n';
}
int main()
{
read();
createFlux();
solve();
afis();
return 0;
}