Pagini recente » Cod sursa (job #966374) | Cod sursa (job #1772532) | Cod sursa (job #2904222) | Cod sursa (job #1916181) | Cod sursa (job #514827)
Cod sursa(job #514827)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int nmax = 1124;
const char iname[] = "critice.in";
const char oname[] = "critice.out";
const int mmax = 10024;
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];
bool viz[nmax], viz2[nmax], viz3[nmax];
int nr[nmax][nmax], reconst[mmax/2], j;
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];
}
bool DF(int nod)
{
viz2[nod] = 1;
for(vector<int>::iterator it2 = Gf[nod].begin(); it2 != Gf[nod].end(); ++ it2)
if(viz2[*it2] == 0 && F[nod][*it2] < C[nod][*it2] && F[*it2][nod] < C[*it2][nod])
{
viz2[*it2] = 1;
DF(*it2);
}
return 0;
}
bool DF2(int nod)
{
viz3[nod] = 1;
for(vector<int>::iterator it2 = Gf[nod].begin(); it2 != Gf[nod].end(); ++ it2)
if(viz3[*it2] == 0 && F[nod][*it2] < C[nod][*it2] && F[*it2][nod] < C[*it2][nod])
{
viz3[*it2] = 1;
DF2(*it2);
}
return 0;
}
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;
C[y][x] = c;
nr[x][y] = i;
nr[y][x] = i;
}
maxflow = 0;
while(BF() == 1)
{
ct = 0;
mflow = 108282121;
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;
}
maxflow += mflow;
}
for(i = 1; i <= n; i ++)
for(j = 0; j < Gf[i].size(); j ++)
{
//memset(viz2, 0, sizeof(viz2));
//memset(viz3, 0, sizeof(viz3));
if(F[i][Gf[i][j]] == C[i][Gf[i][j]])
{
viz2[1] = 1;
viz3[n] = 1;
int x1 = DF(1);
int x2 = DF2(n);
if((viz2[i] == 1 && viz3[Gf[i][j]] == 1) || (viz2[Gf[i][j]] == 1 && viz3[i] == 1))
{
ind1 = Gf[i][j];
ind2 = i;
++sol;
reconst[sol] = nr[ind1][ind2];
}
}
}
fout << sol << "\n";
sort(reconst + 1, reconst + sol + 1);
for(i = 1; i <= sol; i ++)
fout << reconst[i] << "\n";
return 0;
}