Pagini recente » Cod sursa (job #3030512) | Cod sursa (job #1595929) | Cod sursa (job #1145606) | Cod sursa (job #1697318) | Cod sursa (job #1020427)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <cstdlib>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
const int NMAX = 1005;
int F[NMAX][NMAX], C[NMAX][NMAX], T[NMAX];
int use[NMAX], N, M;
vector<int> G[NMAX] , ans;
bitset<NMAX> vis;
vector< pair<int,int> > edges;
void readData() {
fin>>N>>M;
for(int x, y, c, i = 1;i <= M;++i){
fin>>x>>y>>c;
G[x].push_back(y);
G[y].push_back(x);
edges.push_back(make_pair(x,y));
C[x][y] = C[y][x] = c;
}
}
bool bfs() {
queue<int> Q;
for(int i = 1;i <= N;++i) T[i] = -1 , vis[i] = false;
for(Q.push(1) , vis[1] = 1;!Q.empty() && !vis[N];) {
int v = Q.front(); Q.pop();
if(v == N) continue;
for(const auto& w : G[v]) {
if(vis[w] == 0 && C[v][w] > F[v][w]) {
vis[w] = 1;
T[w] = v;
Q.push(w);
}
}
}
return vis[N];
}
void bfR(const int &S,const int &nr){
queue<int> Q;
for(Q.push(S) , use[S] = nr;!Q.empty();) {
int v = Q.front(); Q.pop();
for(const auto& w : G[v]) {
if(!use[w] && C[v][w] > abs(F[v][w])) {
use[w] = nr;
Q.push(w);
}
}
}
}
void flow() {
while(bfs())
for(const auto& w : G[N]) {
if(!vis[w] || C[w][N] == F[w][N]) continue;
T[N] = w;
int fmin = int(1e9);
for(int node = N;node != 1;node = T[node])
fmin = min(fmin,C[T[node]][node] - F[T[node]][node]);
if(!fmin) continue;
for(int node = N;node != 1;node = T[node])
F[node][T[node]] -= fmin , F[T[node]][node]+=fmin;
}
}
int main()
{
readData();
flow();
bfR(1,1);
bfR(N,2);
for(int i = 0;i < M;++i)
if(use[edges[i].first] + use[edges[i].second] == 3)
ans.push_back(i + 1);
fout<<ans.size()<<'\n';
for(int i = 0;i < (int)ans.size();++i) {
fout<<ans[i]<<'\n';
}
return 0;
}