Pagini recente » Cod sursa (job #1988458) | Cod sursa (job #700576) | Cod sursa (job #2253905) | Cod sursa (job #44322) | Cod sursa (job #887173)
Cod sursa(job #887173)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
#define maxn 1005
#define pb push_back
#define mp make_pair
#define forEach(G) for( typeof(G.begin()) it = G.begin(); it != G.end(); ++ it)
int n,m;
int C[maxn][maxn];
int F[maxn][maxn];
int q[maxn];
int TT[maxn];
int show[maxn*12];
int flux;
bool mark1[maxn];
bool markn[maxn];
vector< pair<int,int> > edges;
vector<int> graf[maxn];
void read()
{
in >> n >> m;
int a,b,c;
while(m--)
{
in >> a >> b >> c;
graf[a].pb(b);
graf[b].pb(a);
edges.pb(mp(a,b));
C[a][b]=c;
C[b][a]=c;
}
}
bool bfs()
{
memset(TT,0,sizeof(TT));
int i,nod;
q[0]=1;
q[1]=1;
TT[1]=1;
for(i=1;i <= q[0]; ++ i)
{
nod = q[i];
if(nod == n)
continue;
forEach(graf[nod])
{
if(TT[*it] || C[nod][*it] == F[nod][*it])
continue;
TT[*it] = nod;
q[++q[0]] = (*it);
}
}
return TT[n];
}
void aug()
{
int nod;
int fmin;
while(bfs())
{
forEach(graf[n])
{
if(!TT[*it] || C[*it][n] == F[*it][n])
continue;
TT[n] = *it;
fmin = 1 << 29;
for(nod = n; nod != 1; nod = TT[nod])
fmin = min(fmin,C[ TT[nod] ][ nod ] - F[ TT[nod] ][ nod ]);
if(fmin == 0)
continue;
for(nod = n; nod != 1;nod = TT[nod])
{
F[TT[nod]][nod] += fmin;
F[nod][TT[nod]] -= fmin;
}
flux += fmin;
}
}
}
void mark(int nod,bool * wat,bool dir)
{
wat[nod]=1;
forEach(graf[nod])
{
if(wat[*it])
continue;
if(dir == 0)
{
if(C[nod][*it] > F[nod][*it])
mark(*it,wat,dir);
}
else
{
if(C[*it][nod] > F[*it][nod])
mark(*it,wat,dir);
}
}
}
void pass()
{
forEach(edges)
{
if(mark1[it->first] && markn[it->second] && C[it->first][it->second] == F[it->first][it->second])
show[++show[0]] = it-edges.begin()+1;
else if(markn[it->first] && mark1[it->second] && C[it->second][it->first] == F[it->second][it->first])
show[++show[0]] = it-edges.begin()+1;
}
}
void solve()
{
aug();
mark(1,mark1,0);
mark(n,markn,1);
pass();
}
void afis()
{
int i;
for(i=0;i<=show[0];++i)
out << show[i] << "\n";
}
int main()
{
read();
solve();
afis();
return 0;
}