Pagini recente » Cod sursa (job #3227945) | Cod sursa (job #1384820) | Cod sursa (job #1639025) | Cod sursa (job #1588832) | Cod sursa (job #514829)
Cod sursa(job #514829)
#include <iostream>
#include <cstdio>
#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()
{
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
scanf("%d %d", &n, &m);
for(i = 1; i <= m; i ++)
{
scanf("%d %d %d", &x, &y, &c);
//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];
}
}
}
printf("%d\n", sol);
sort(reconst + 1, reconst + sol + 1);
for(i = 1; i <= sol; i ++)
printf("%d\n", reconst[i]);
return 0;
}