Pagini recente » Cod sursa (job #1446179) | Cod sursa (job #2183754) | Cod sursa (job #1171481) | Cod sursa (job #3233743) | Cod sursa (job #2694892)
#include <fstream>
#include <iostream>
#include <queue>
using namespace std;
int c[1001][1001], f[1001][1001];
int viz[1001],T[1001],lista[10001];
int n,m,lung,minim;
ifstream fin("critice.in");
ofstream fout("critice.out");
struct arc{int n1,n2;};
arc drum[1001],lm[10001];
int bf(){
int i,j;
queue <int> q;
fill(viz,viz+1001,0);fill(T,T+1001,0);
q.push(1);
viz[1] = 1;
while (q.empty() != 1){
i = q.front();
if (i == n)return 1;
q.pop();
for (j = 1;j<=n;j++){
if (viz[j] == 0 && c[i][j] - f[i][j] > 0){//arc parcurs in sens direct
viz[j] = 1;
T[j] = i;
q.push(j);}
if (viz[j] == 0 && f[j][i] > 0){//arc parcurs in sens invers
viz[j] = 1;
T[j] = i;
q.push(j);}}}
return 0;
}
void calcdrum(){
int i=0,b=n,a;
minim = 10000000;
a = T[b];
while (a!=0){
drum[i].n1 = a;
drum[i].n2 = b;
if (c[a][b] > f[a][b]){
if (minim > c[a][b] - f[a][b])
minim = c[a][b] - f[a][b];}
else
if (minim > f[b][a])
minim = f[b][a];
i++;
b = a;
a = T[b];}
lung = i;
}
int main(){
int ok=1;
fin >> n >> m;
for (int i=0;i<m;i++){
fin >> lm[i].n1 >> lm[i].n2;
fin >> c[lm[i].n1][lm[i].n2];
c[lm[i].n2][lm[i].n1]=c[lm[i].n1][lm[i].n2];}
while (ok == 1){
ok=bf(); //returneaza 1 daca gaseste un drum
if (ok == 1){
calcdrum(); //calculeaza si minimul
for (int k=0;k<lung;k++){
int i = drum[k].n1;
int j = drum[k].n2;
if (c[i][j] - f[i][j] > 0)
f[i][j] += minim;
else
f[j][i] -= minim;}}}
int lLista=0;
for(int i=0;i<m;i++){
c[lm[i].n2][lm[i].n1]++;
c[lm[i].n1][lm[i].n2]++;
ok=bf(); //returneaza 1 daca gaseste un drum
if (ok == 1){
calcdrum(); //calculeaza si minimul
if(minim>0)
lista[lLista++]=i+1;}
c[lm[i].n2][lm[i].n1]--;
c[lm[i].n1][lm[i].n2]--;}
fout<<lLista<<endl;
for(int i=0;i<lLista;i++)
fout<<lista[i]<<endl;
return 0;}