Pagini recente » Cod sursa (job #538637) | Cod sursa (job #972301) | Cod sursa (job #882049) | Cod sursa (job #1509582) | Cod sursa (job #514697)
Cod sursa(job #514697)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int nmax = 1024;
const char iname[] = "critice.in";
const char oname[] = "critice.out";
ifstream fin(iname);
ofstream fout(oname);
vector<int> Gf[nmax];
int n, m, i, x, y, maxflow, mflow, c, ct, sol, ind1 , ind2;
int C[nmax][nmax], F[nmax][nmax], T[nmax], viz[nmax];
int nr[nmax][nmax], reconst[nmax];
queue<int> Q;
bool BF()
{
int first = 0; //inceputul cozii
for(i = 1; i <= n; i ++)
viz[i] = 0;
//memset(T, 0, sizeof(T));
Q.push(1);
viz[1] = 1;
while(!Q.empty())
{
first = Q.front();
Q.pop();
for(vector<int>::iterator it = Gf[first].begin(); it != Gf[first].end(); ++ it)
{
if(C[first][*it] == F[first][*it] || viz[*it])
continue;
T[*it] = first;
viz[*it] = 1;
Q.push(*it);
if(*it == n)
continue;
}
}
return viz[n];
}
int main()
{
fin >> n >> m;
for(i = 1; i <= m; i ++)
{
fin >> x >> y >> c;
Gf[x].push_back(y);
Gf[y].push_back(x);
C[x][y] = c;
nr[x][y] = i;
}
maxflow = 0;
while(BF() == 1)
{
ct = 0;
mflow = 282822;
for(i = n; i != 1; i = T[i])
mflow = min(mflow, C[T[i]][i] - F[T[i]][i]);
for(i = n; i != 1; i = T[i])
{
F[T[i]][i] += mflow;
F[i][T[i]] -= mflow;
}
for(i = n; i != 1; i = T[i])
if(C[T[i]][i] == F[T[i]][i])
{
ct ++;
ind1 = T[i];
ind2 = i;
}
if(ct == 1)
{
++sol;
reconst[sol] = nr[ind1][ind2];
}
maxflow += mflow;
}
fout << sol << "\n";
sort(reconst + 1, reconst + sol + 1);
for(i = 1; i <= sol; i ++)
fout << reconst[i] << "\n";
return 0;
}