Pagini recente » Cod sursa (job #533266) | Cod sursa (job #610) | Cod sursa (job #2944605) | Cod sursa (job #1827349) | Cod sursa (job #2691223)
#include <iostream>
#include <bits/stdc++.h>
#define MAX 1001
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
int N,M,S,F; // Nr noduri, start, finish
vector<int> Graph[MAX];
int capacitate[MAX][MAX];
int flow[MAX][MAX];
int muchii[MAX][MAX];
int bfs(vector<int> &tata)
{
fill(tata.begin(),tata.end(),-1);
pair<int,int> que[MAX]; //Nod, flow
int L=1;
que[L]= {S,2e9};
tata[S]=S;
for(int i=1; i<=L; i++)
{
int cur = que[i].first;
int curFlow = que[i].second;
for(auto next : Graph[cur])
{
if(tata[next] == -1 && (capacitate[cur][next]-flow[cur][next]>0)) // Daca nu e deja vizitat si mai putem creste fluxul
{
tata[next] = cur;
int new_flow = min(curFlow,capacitate[cur][next]-flow[cur][next]);
if(next==F)
return new_flow;
que[++L]= {next,new_flow};
}
}
}
return 0;
}
int main()
{
int x,y,z;
in>>N>>M;
S=1;
F=N;
for(int i=1; i<=M; i++)
{
in>>x>>y>>z; //Nod, Nod, capacitatea maxima
Graph[x].push_back(y);
Graph[y].push_back(x);
capacitate[x][y] =capacitate[y][x]= z;
muchii[x][y]=muchii[y][x]=i;
}
vector<int> tata(N+1);
int new_flow,previous, maxflow=0;
while(new_flow = bfs(tata)) //Cat timp gasim un lant nesaturat
{
maxflow+=new_flow; //Crestem fluxul
int current = F;
while(current!=S) //Updatam capacitatile
{
previous = tata[current];
flow[previous][current]+=new_flow; // Pe muchiile directe adun fluxul adaugat
flow[current][previous]-=new_flow; // Pe muchiile inverse scad
current = previous;
}
}
vector<int> rez;
rez.reserve(M);
for(int i=1; i<=N; i++)
for(auto j : Graph[i])
if(tata[i]!=-1 && capacitate[i][j] ) //Daca avem muchie dinspre un nod din taietura spre restul, o afisam
rez.push_back(muchii[i][j]);
out<<rez.size()<<'\n';
for(auto temp: rez)
out<<temp<<'\n';
return 0;
}