Pagini recente » Cod sursa (job #779929) | Cod sursa (job #734560) | Cod sursa (job #1141837) | Cod sursa (job #1963391) | Cod sursa (job #2238354)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stdlib.h>
#define nmax 1005
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,m, cp[nmax][nmax], fx[nmax][nmax], viz[nmax], t[nmax], viz1[nmax];
vector <int> v[nmax],sol;
queue <int> q;
struct bla{
int x,y;
}M[10*nmax];
void citire()
{
int i,j,k,c;
f>>n>>m;
for(k=1; k<=m; k++)
{
f>>i>>j>>c;
v[i].push_back(j);
v[j].push_back(i);
cp[i][j]= cp[j][i]= c;
M[k]={i,j};
}
}
int bfs()
{
int nod,i;
while(!q.empty()) q.pop();
for(i=1; i<=n; i++) viz[i]=0;
viz[1]=1;
q.push(1);
while(!q.empty())
{
nod=q.front();
q.pop();
for(i=0; i<v[nod].size(); i++)
if(!viz[v[nod][i]] && cp[nod][v[nod][i]]>fx[nod][v[nod][i]])
{
q.push(v[nod][i]);
viz[v[nod][i]]=1;
t[v[nod][i]]=nod;
if(v[nod][i]==n)
return 1;
}
}
return 0;
}
int flux_minim()
{
int nod, flux, fmin,j;
for(flux=0; bfs();)
for(j=0; j<v[n].size(); j++)
if(viz[v[n][j]] && abs(cp[v[n][j]][n]) > abs(fx[v[n][j]][n]) )
{
t[n]=v[n][j];
fmin=1e9;
for(nod=n; nod!=1; nod=t[nod])
fmin=min(fmin, cp[t[nod]][nod]-fx[t[nod]][nod]);
for(nod=n; nod!=1; nod=t[nod])
{
fx[nod][t[nod]]-= fmin;
fx[t[nod]][nod]+= fmin;
}
flux+=fmin;
}
return flux;
}
void dfs(int nod, int mark)
{
int i;
viz1[nod]=mark;
for(i=0; i<v[nod].size(); i++)
if(!viz1[v[nod][i]] && abs(cp[nod][v[nod][i]]) > abs(fx[nod][v[nod][i]]) )
dfs(v[nod][i], mark);
}
int main()
{
citire();
int fl,i, nr=0;
fl=flux_minim();
for(i=1; i<=n; i++)
viz1[i]=0;
dfs(1,1);
dfs(n,2);
for(i=1; i<=m; i++)
if(viz1[M[i].x] && viz1[M[i].y] && viz1[M[i].x]!=viz1[M[i].y])
{nr++; sol.push_back(i);}
g<<nr<<"\n";
for(i=0; i<sol.size(); i++)
g<<sol[i]<<"\n";
f.close();
g.close();
return 0;
}