Pagini recente » Cod sursa (job #1050198) | Cod sursa (job #1853083) | Cod sursa (job #193159) | Cod sursa (job #2927731) | Cod sursa (job #1882300)
#include <bits/stdc++.h>
#define NMAX 1050
#define INF 1e9
#define f first
#define s second
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
vector < int > G[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX],ant[NMAX];
bool B[NMAX],M[NMAX][2];
vector < pair < int, int > > E;
void DFS(const int &nod,const int &n){
M[nod][n] = 1;
for(auto const &it : G[nod]){
if(!M[it][n] && ( (!n && C[nod][it] > F[nod][it]) || (n && C[it][nod] > F[it][nod]) ) )
DFS(it,n);
}
}
bool BFS(const int &N){
int nod;
memset(B,0,NMAX);
B[1] = 1;
queue < int > Q;
Q.push(1);
while(!Q.empty()){
nod = Q.front();
Q.pop();
if(nod == N) continue;
for(auto const &it : G[nod]){
if(B[it] || C[nod][it] == F[nod][it]) continue;
B[it] = 1;
Q.push(it);
ant[it] = nod;
}
}
return B[N];
}
int main()
{
ios :: sync_with_stdio(false);
fin.tie(NULL);
int n,m,c,x,y;
fin >> n >> m;
for(int i = 1; i <= m; i++){
fin >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = C[y][x] = c;
E.push_back({x,y});
}
int mflow;
while(BFS(n)){
for(auto const &it : G[n]){
if(!B[it] || F[it][n] == C[it][n]) continue;
ant[n] = it;
mflow = INF;
for(int i = n; i != 1; i = ant[i]){
mflow = min(mflow,C[ant[i]][i] - F[ant[i]][i]);
}
if(mflow == 0) continue;
for(int i = n; i != 1; i = ant[i]){
F[ant[i]][i] += mflow;
F[i][ant[i]] -= mflow;
}
}
}
DFS(1,0);
DFS(n,1);
int i = 0;
vector < int > S;
for(auto const &it : E){
i++;
if((C[it.f][it.s] == F[it.f][it.s] || C[it.s][it.f] == F[it.s][it.f]) && ((M[it.f][0] && M[it.s][1]) || (M[it.s][0] && M[it.f][1])))
S.push_back(i);
}
fout << S.size() << "\n";
for(auto const &it : S)
fout << it << "\n";
return 0;
}