Pagini recente » Monitorul de evaluare | Cod sursa (job #3331310) | Cod sursa (job #3335288) | Cod sursa (job #3330691) | Cod sursa (job #3324666)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("critice.in");
ofstream fout ("critice.out");
const int DIM = 1000, DIMM = 5000;
struct muchie
{
int nod, pos;
};
muchie t[DIM + 1];
vector <muchie> v[DIM + 1];
int n, m, x[2 * DIMM + 1], y[2 * DIMM + 1], dp[DIM + 1], dp1[DIM + 1], dp2[DIM + 1];
queue <int> q;
int c[2 * DIMM + 1];
vector <int> sol;
void read ()
{
int p;
fin >> n >> m;
for (int i = 0; i < m; i++)
{
fin >> x[i] >> y[i] >> p;
v[x[i]].push_back ({y[i], 2 * i});
v[y[i]].push_back ({x[i], 2 * i + 1});
c[2 * i] = c[2 * i + 1] = p;
}
}
bool bfs ()
{
for (int i = 1; i <= n; i++)
t[i] = {0, 0}, dp[i] = 0;
q.push (1);
dp[1] = 1e9;
while (!q.empty ())
{
int nod = q.front ();
q.pop ();
for (int i = 0; i < (int) v[nod].size (); i++)
{
int vecin = v[nod][i].nod;
int pos = v[nod][i].pos;
if (dp[vecin] == 0 && c[pos])
{
t[vecin] = {nod, pos};
q.push (vecin);
dp[vecin] = min (c[pos], dp[nod]);
}
}
}
return dp[n];
}
void add_flux (int flux)
{
int nod = n;
while (nod != 1)
{
c[t[nod].pos] -= flux;
c[t[nod].pos ^ 1] += flux;
nod = t[nod].nod;
}
}
void bfs_ok (int nod, int val, int dp[])
{
dp[nod] = 1;
q.push (nod);
while (!q.empty ())
{
int nod = q.front ();
q.pop ();
for (int i = 0; i < (int) v[nod].size (); i++)
{
int vecin = v[nod][i].nod;
int pos = v[nod][i].pos;
pos ^= val;
if (c[pos] && dp[vecin] == 0)
{
dp[vecin] = 1;
q.push (vecin);
}
}
}
}
void solve ()
{
while (bfs ())
add_flux (dp[n]);
bfs_ok (1, 0, dp1);
bfs_ok (n, 1, dp2);
for (int i = 0; i < m; i++)
{
if ((dp1[x[i]] && dp2[y[i]] && c[2 * i] == 0) || (dp1[y[i]] && dp2[x[i]] && c[2 * i + 1] == 0))
sol.push_back (i + 1);
}
fout << sol.size () << "\n";
for (int i = 0; i < (int) sol.size (); i++)
fout << sol[i] << "\n";
}
int main ()
{
read ();
solve ();
return 0;
}