Pagini recente » Cod sursa (job #286309) | Cod sursa (job #2120272) | Cod sursa (job #403105) | Cod sursa (job #208227) | Cod sursa (job #2660722)
#include <bits/stdc++.h>
#define DIM 1010
#define INF 2000000000
using namespace std;
int capacitate[DIM][DIM],dist[DIM],st[DIM];
deque <int> c;
vector <int> L[DIM],sol;
pair <int,int> mch[DIM*10];
int n,m,i,j,x,y,cap,sursa,dest;
int bfs (int sursa, int dest){
for (int i=1;i<=n;i++)
dist[i] = INF;
c.clear();
c.push_back(sursa);
dist[sursa] = 0;
while (!c.empty()){
int nod = c.front();
c.pop_front();
for (auto vecin : L[nod]){
if (!capacitate[nod][vecin])
continue;
if (dist[vecin] == INF){
dist[vecin] = 1 + dist[nod];
c.push_back(vecin);
}}}
return dist[dest] != INF;
}
int dfs (int nod, int dest, int max_flow){
if (nod == dest || !max_flow)
return max_flow;
int flow = 0;
for (;st[nod]<L[nod].size();st[nod]++){
int vecin = L[nod][st[nod]];
if (dist[vecin] == 1 + dist[nod] && capacitate[nod][vecin]){
int val = dfs (vecin,dest,min(capacitate[nod][vecin],max_flow-flow));
flow += val;
capacitate[nod][vecin] -= val;
capacitate[vecin][nod] += val;
}
}
return flow;
}
int main (){
ifstream cin ("critice.in");
ofstream cout ("critice.out");
cin>>n>>m;
for (i=1;i<=m;i++){
cin>>x>>y>>cap;
L[x].push_back(y);
L[y].push_back(x);
capacitate[x][y] = cap;
capacitate[y][x] = cap;
mch[i] = make_pair(x,y);
}
sursa = 1, dest = n;
int flux, soll = 0;
do{
for (i=1;i<=n;i++)
st[i] = 0;
bfs (sursa,dest);
flux = dfs (sursa,dest,INF);
soll += flux;
} while (flux);
//cout<<soll<<"\n";
for (i=1;i<=m;i++){
int x = mch[i].first, y = mch[i].second;
if (!capacitate[x][y]){ /// e saturata
capacitate[x][y]++;
if (bfs(sursa,dest))
sol.push_back(i);
capacitate[x][y]--;
}
if (!capacitate[y][x]){
capacitate[y][x]++;
if (bfs(sursa,dest))
sol.push_back(i);
capacitate[y][x]--;
}
}
sol.resize(unique(sol.begin(),sol.end()) - sol.begin());
cout<<sol.size()<<"\n";
for (auto it : sol)
cout<<it<<"\n";
return 0;
}