Pagini recente » Borderou de evaluare (job #2402357) | Borderou de evaluare (job #1365821) | Cod sursa (job #3217905) | Borderou de evaluare (job #947097) | Cod sursa (job #915389)
Cod sursa(job #915389)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define MAX 1005
#define MMAX 10005
#define INF 0x3f3f3f3f
using namespace std;
int N, M;
int F[MAX][MAX], dad[MAX], A[MMAX], B[MMAX];
bool viz[MAX], Marked[MAX][2];
vector<int> V[MAX];
queue<int> Q;
void citire() {
ifstream in("critice.in");
in>>N>>M;
for(int i = 1, X, Y, C; i <= M; i++) {
in>>X>>Y>>C;
V[X].push_back(Y);
V[Y].push_back(X);
F[X][Y] = F[Y][X] = C;
A[i] = X, B[i] = Y;
} in.close();
}
bool bfs() {
memset(viz, 0, sizeof(viz));
Q.push(1); viz[1] = true;
while(!Q.empty()) {
int nod = Q.front(); Q.pop();
if(nod == N) continue;
for(size_t i = 0; i < V[nod].size(); i++) {
int dest = V[nod][i];
if(!F[nod][dest] || viz[dest]) continue;
dad[dest] = nod;
viz[dest] = true;
Q.push(dest);
}
}
return viz[N];
}
void flux() {
while(bfs()) {
for(size_t i = 0; i < V[N].size(); i++) {
int nod = V[N][i], val = INF;
if(!F[nod][N] || !viz[nod]) continue;
dad[N] = nod;
nod = N;
while(nod != 1) {
val = min(val, F[dad[nod]][nod]);
nod = dad[nod];
}
if(val) {
nod = N;
while(nod != 1) {
F[dad[nod]][nod] -= val;
F[nod][dad[nod]] += val;
nod = dad[nod];
}
}
}
}
}
void dfs(int nod, int mark) {
Marked[nod][mark] = true;
for(size_t i = 0; i < V[nod].size(); i++) {
int dest = V[nod][i];
if(Marked[dest][mark] || (!mark && !F[nod][dest]) || (mark && !F[dest][nod]))
continue;
dfs(dest, mark);
}
}
void afisare() {
vector<int> ans;
for(int i = 1; i <= M; i++)
if((Marked[A[i]][0] && Marked[B[i]][1]) ||
(Marked[A[i]][1] && Marked[B[i]][0]))
ans.push_back(i);
ofstream out("critice.out");
out<<ans.size()<<"\n";
for(size_t i = 0; i < ans.size(); i++) out<<ans[i]<<"\n";
out.close();
}
int main()
{
citire();
flux();
dfs(1, 0);
dfs(N, 1);
afisare();
return 0;
}