Pagini recente » Cod sursa (job #406850) | Cod sursa (job #322246) | Cod sursa (job #2230047) | Cod sursa (job #991916) | Cod sursa (job #2084233)
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("critice.in");
ofstream out ("critice.out");
const int dim = 1001;
int graf[dim],vec[dim],tata[dim],rez[dim],mark[dim][dim];
int cap[dim][dim],ind[dim][dim],flux[dim][dim];
int n,k,m,a,b,c;
vector<int>v[dim];
bool bfs () {
for (int i = 1; i <= n;i ++) {
graf[i] = 0;
}
bool ok = 0;
vec[1] = 1;
graf[1] = 1;
tata[1] = 0;
for (int st = 1, dr = 1; st <= dr; st ++) {
a = vec[st];
for (int i = 0; i < v[a].size(); i ++) {
b = v[a][i];
if (graf[b] == 0 && cap[a][b] > flux[a][b]) {
if (b not_eq n){
tata[b] = a;
vec[++dr] = b;
graf[b] = 1;
}
else{
ok = 1;
}
}
}
}
if (ok == 1){
return 1;
}
else{
return 0;
}
}
void solve_bfs(int s, int f, int caz) {
for (int i = 1; i <= n;i ++) {
graf[i] = 0;
}
int x,y;
vec[1] = s;
graf[s] = 1;
for (int st = 1, dr = 1; st <= dr; st ++) {
a = vec[st];
for (int i = 0; i < v[a].size(); i ++) {
b = v[a][i];
x = a; y = b;
if (caz) {
x = b; y = a;
}
if (cap[x][y] == flux[x][y]) {
mark[x][y] ++;
}
if (graf[b] == 0) {
if (cap[x][y] == flux[x][y]) {
if (b != f)
graf[b] = 1;
}
else{
if (b!= f){
vec[++dr] = b;
graf[b] = 1;
}
}
}
}
}
}
int main (void) {
in >> n >> m;
for (int i = 1; i <= m;i ++) {
in >> a >> b >> c;
v[a].push_back(b);
v[b].push_back(a);
cap[a][b] = c;
cap[b][a] = c;
ind [a][b] = i;
ind [b][a] = i;
}
while (bfs()){
for (int i = 0; i < v[n].size(); i ++) {
int vecin = v[n][i];
int minim = cap[vecin][n] - flux[vecin][n];
int x = vecin;
while (tata[x] not_eq 0) {
minim = min (minim, cap[tata[x]][x]- flux[tata[x]][x]);
x = tata[x];
}
x = vecin;
while (tata[x] not_eq 0) {
flux[tata[x]][x] += minim;
flux[x][tata[x]] -= minim;
x = tata[x];
}
}
}
solve_bfs (1,n,0);
solve_bfs (n,1,1);
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
if (mark[i][j] == 2) {
rez [++k] = ind[i][j];
}
}
}
out << k <<"\n";
for (int i = 1; i <= k; i ++){
out << rez[i] <<"\n";
}
return 0;
}