Pagini recente » Cod sursa (job #1655908) | Cod sursa (job #193295) | Cod sursa (job #642142) | Cod sursa (job #1392143) | Cod sursa (job #791311)
Cod sursa(job #791311)
#include <fstream>
#include <vector>
#include <queue>
#define NMAx 1010
#define MMAx 10100
#define oo (1<<30)
using namespace std;
vector <int> G[NMAx],Sol;
queue <int> Q;
int N,M,paint,sw,viz[NMAx],Flux[NMAx][NMAx];
int T[NMAx],X[MMAx],Y[MMAx];
bool V[NMAx][2];
void DFS(int Nod) {
V[Nod][sw]=1;
for(int i=0;i<G[Nod].size();i++)
if(Flux[Nod][G[Nod][i]]&&!V[G[Nod][i]][sw])
DFS(G[Nod][i]);
}
bool BF() {
int i,Nod,Vecin;
Q.push(1);
++paint;
viz[1]=paint;
while(!Q.empty()) {
Nod=Q.front();
Q.pop();
for(i=0;i<G[Nod].size();i++) {
Vecin=G[Nod][i];
if(!Flux[Nod][Vecin]||viz[Vecin]==paint)
continue;
viz[Vecin]=paint;
T[Vecin]=Nod;
Q.push(Vecin);
}
}
return (viz[N]==paint);
}
void Solve() {
int i,e,Nod;
while(BF())
for(i=0;i<G[N].size();i++) {
Nod=G[N][i];
if(!Flux[Nod][N]||viz[Nod]!=paint)
continue;
T[N]=Nod;
for(Nod=N,e=oo;Nod!=1;Nod=T[Nod])
e=min(e,Flux[T[Nod]][Nod]);
for(Nod=N;Nod!=1;Nod=T[Nod]) {
Flux[T[Nod]][Nod]-=e;
Flux[Nod][T[Nod]]+=e;
}
}
sw=0;DFS(1);
sw=1;DFS(N);
for(i=1;i<=M;i++)
if((!Flux[X[i]][Y[i]] && V[X[i]][0] && V[Y[i]][1]) || (!Flux[Y[i]][X[i]] && V[X[i]][1] && V[Y[i]][0]))
Sol.push_back(i);
}
void Citire() {
int i,C;
ifstream in("critice.in");
in>>N>>M;
for(i=1;i<=M;i++) {
in>>X[i]>>Y[i]>>C;
G[X[i]].push_back(Y[i]);
G[Y[i]].push_back(X[i]);
Flux[X[i]][Y[i]]=Flux[Y[i]][X[i]]=C;
}
in.close();
}
void Afis() {
ofstream out("critice.out");
out<<Sol.size()<<'\n';
for(int i=0;i<Sol.size();out<<Sol[i++]<<'\n');
out.close();
}
int main() {
Citire();
Solve();
Afis();
return 0;
}