Pagini recente » Cod sursa (job #1753805) | Cod sursa (job #2020216) | Cod sursa (job #1767168) | Cod sursa (job #593909) | Cod sursa (job #905038)
Cod sursa(job #905038)
#include <fstream>
#include <queue>
#include <cstring>
#define MAX 1010
#define MAXM 10010
using namespace std;
int sol, S[MAXM], X[MAXM], Y[MAXM], cap[MAX][MAX], n, i, m, y, z, x, flux, total, from[MAX];
bool viz[MAX][2];
queue <int> Q;
vector <int> G[MAX];
vector <int> :: iterator it;
bool BF()
{
memset(from, 0, sizeof(from));
from[1] = -1;
Q.push(1);
while(!Q.empty())
{
x = Q.front();
Q.pop();
for(it = G[x].begin(); it != G[x].end(); ++it)
if(cap[x][*it] and !from[*it])
{
from[*it] = x;
Q.push(*it);
}
}
return from[n];
}
void BF_final(int S, int tip)
{
viz[S][tip] = 1;
Q.push(S);
while(!Q.empty())
{
x = Q.front();
Q.pop();
for(it = G[x].begin(); it != G[x].end(); ++it)
if(cap[x][*it] and !viz[*it][tip])
{
viz[*it][tip] = 1;
Q.push(*it);
}
}
}
int main()
{
ifstream fi("critice.in");
ofstream fo("critice.out");
fi >> n >> m;
for(i = 1; i <= m; i++)
{
fi >> x >> y >> z;
cap[x][y] = cap[y][x] = z;
G[x].push_back(y);
G[y].push_back(x);
X[i] = x; Y[i] = i;
}
while(BF())
{
for(it = G[n].begin(); it != G[n].end(); ++it)
if(cap[*it][n] and from[*it])
{
flux = cap[*it][n];
for(i = *it; from[i] != -1; i = from[i])
flux = min(flux, cap[from[i]][i]);
cap[*it][n] -= flux, cap[n][*it] += flux;
for(i = *it; from[i] != -1; i = from[i])
cap[from[i]][i] -= flux, cap[i][from[i]] += flux;
total += flux;
}
}
BF_final(1, 0);
BF_final(n, 1);
for(i = 1; i <= m; i++)
if((viz[X[i]][0] and viz[Y[i]][1]) or (viz[Y[i]][0] and viz[X[i]][1]))
S[++sol] = i;
fo << sol << "\n";
for(i = 1; i <= sol; i++) fo << S[i] << "\n";
return 0;
}