Pagini recente » Cod sursa (job #591318) | Cod sursa (job #1824297) | Cod sursa (job #1011272) | Cod sursa (job #2721742) | Cod sursa (job #2386821)
#include <bits/stdc++.h>
#define maxn 1000
#define maxm 10000
#define inf INT_MAX/2-1
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
struct yes {int z1, z2, ind;};
vector <int> g[maxn+5];
vector <int> way;
vector <yes> cand;
vector <int> crit;
int _cap[maxn+5][maxn+5], _flx[maxn+5][maxn+5];
bool viz[maxn+5];
int flag;
int n, m;
void _reset () { for ( int i = 0; i < n; i++ ) viz[i] = 0; }
void dfs ( int nod )
{
int i, sz = g[nod].size(), nn;
viz[nod] = 1;
way.push_back (nod);
if ( nod == n - 1 ) { flag = 1; return; }
for ( i = 0; i < sz && flag == 0; i++ )
{
nn = g[nod][i];
if ( viz[nn] == 0 && _flx[nod][nn] < _cap[nod][nn] ) dfs (nn);
}
if ( flag == 0 ) way.pop_back();
}
void dfs2 ( int nod )
{
viz[nod] = 1;
if ( viz[0] == 1 && viz[n-1] == 1 ) return;
int i, sz = g[nod].size(), nn;
for ( i = 0; i < sz; i++ )
{
nn = g[nod][i];
if ( viz[nn] == 0 && max(_flx[nn][nod],_flx[nod][nn]) < _cap[nod][nn] ) dfs2 (nn);
}
}
int main ()
{
ifstream fin ( "critice.in" );
ofstream fout ( "critice.out" );
fin >> n >> m;
int i, j, z, a, b, c, sz, delta, aux;
for ( i = 0; i < m; i++ )
{
fin >> a >> b >> c; a--; b--;
g[a].push_back (b); _cap[a][b] = c;
g[b].push_back (a); _cap[b][a] = c;
}
dfs (0);
while ( flag == 1 )
{
delta = inf;
sz = way.size();
for ( i = 0; i < sz-1; i++ ) delta = min (delta,_cap[way[i]][way[i+1]] - _flx[way[i]][way[i+1]]);
for ( i = 0; i < sz-1; i++ ) _flx[way[i]][way[i+1]] += delta, _flx[way[i+1]][way[i]] -= delta;
_reset(); way.clear();
flag = 0; dfs (0);
}
fin.close(); fin.open ( "critice.in" ); fin >> n >> m;
for ( i = 0; i < m; i++ )
{
fin >> a >> b >> c; a--; b--;
if ( _flx[a][b] == _cap[a][b] ) cand.push_back ( {a,b,i} );
else if ( _flx[b][a] == _cap[b][a] ) cand.push_back ( {b,a,i} );
}
for ( i = 0; i < cand.size(); i++ )
{
_reset();
_cap[cand[i].z1][cand[i].z2]++;
dfs2 ( cand[i].z1 );
_cap[cand[i].z1][cand[i].z2]--;
if ( viz[0] == 1 && viz[n-1] == 1 ) crit.push_back(1+cand[i].ind);
}
sort ( crit.begin(), crit.end() );
fout << crit.size() << '\n';
for ( i = 0; i < crit.size(); i++ ) fout << crit[i] << '\n';
fin.close ();
fout.close ();
return 0;
}