Pagini recente » Cod sursa (job #2078346) | Cod sursa (job #1513631) | Cod sursa (job #451857) | Cod sursa (job #2014388) | Cod sursa (job #1915049)
#include <bits/stdc++.h>
using namespace std;
#define MaxN 1001
#define INF 0x3f3f3f3f
ifstream fin("critice.in");
ofstream fout("critice.out");
int n, m, x, y, z, minflow;
int c[MaxN][MaxN], f[MaxN][MaxN], t[MaxN];
pair<int,int> Edge[MaxN];
vector<int> G[MaxN], ans;
bool viz[MaxN], viz1[MaxN], viz2[MaxN];
void Read();
void Solve();
bool Bf();
void Bf(int, bool[]);
void Write();
int main() {
Read();
Solve();
Write();
}
void Solve() {
while(Bf()) {
for ( const auto x : G[n] )
if ( f[x][n] <= c[x][n] && viz[x] ) {
t[n] = x;
minflow = INF;
for ( int i = n; i != 1; i = t[i] )
minflow = min(minflow, c[t[i]][i] - f[t[i]][i]);
for ( int i = n ; i != 1; i = t[i] ) {
f[t[i]][i] += minflow;
f[i][t[i]] -= minflow;
}
}
}
Bf(1, viz1);
Bf(n, viz2);
for ( int i = 1; i <= m; ++i ) {
int x = Edge[i].first;
int y = Edge[i].second;
if ( (c[x][y] == f[x][y] || c[y][x] == f[y][x]) && ((viz1[x] && viz2[y]) || (viz1[y] && viz2[x])))
ans.push_back(i);
}
}
void Write() {
fout << ans.size() << '\n';
for ( const auto x : ans )
fout << x << '\n';
}
void Bf(int start, bool viz[] ) {
queue<int> Q;
Q.push(start);
viz[start] = true;
while(Q.size()) {
int x = Q.front();
Q.pop();
for ( const auto y : G[x] )
if ( c[x][y] > abs(f[x][y]) && !viz[y] ) {
viz[y] = true;
Q.push(y);
}
}
}
bool Bf() {
queue<int> Q;
Q.push(1);
memset(viz, 0, sizeof viz);
viz[1] = true;
while(Q.size()) {
int x = Q.front();
Q.pop();
if ( x == n ) break;
for ( const auto y : G[x] )
if ( c[x][y] > f[x][y] && !viz[y] ) {
viz[y] = true;
Q.push(y);
t[y] = x;
}
}
return viz[n];
}
void Read() {
fin >> n >> m;
for ( int i = 1; i <= m; ++i ) {
fin >> x >> y >> z;
G[x].push_back(y);
G[y].push_back(x);
c[x][y] = c[y][x] = z;
Edge[i] = {x, y};
}
}