Pagini recente » Cod sursa (job #1644784) | Cod sursa (job #753847) | Cod sursa (job #923879) | Cod sursa (job #2149676) | Cod sursa (job #1915175)
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;
ifstream cin("critice.in");
ofstream cout("critice.out");
#define PB push_back
const int NM=1024;
const int MM=1024;
const int INF=0x3f3f3f3f;
int N,M,A[MM],B[MM],T[NM];
int C[NM][NM],F[NM][NM],W[NM][NM];
vector <int> G[NM];
void read(){
int i, u, v, c;
cin>>N>>M;
for (i = 1; i <= M; ++i) {
cin>>u>>v>>c;
G[u].PB(v);
G[v].PB(u);
C[u][v] = C[v][u] = c;
A[i] = u;
B[i] = v;
}}
bool BFS(int S, int D, int mark) {
int Q[NM], NQ, i, u;
vector <int> :: iterator k;
memset(T, 0xff, sizeof(T));
T[S]=0;Q[NQ=0]=S;
for (i = 0; i <= NQ; ++i)
for (k = G[u = Q[i]].begin(); k != G[u].end(); ++k) {
if (mark && C[u][*k] == max(F[u][*k], F[*k][u])) {
W[u][*k] |= mark;
W[*k][u] |= mark;
continue;
}
if(T[*k] != -1 || C[u][*k]==F[u][*k]) continue;
T[*k] = u;
Q[++NQ] = *k;
if (*k == D) return true;
}return false;}
void edmond_karp() {
int u, v, flux;
while(BFS(1,N,0)){
flux = INF;
for (u = T[v = N]; u; u = T[v = u])
flux = min(flux, C[u][v] - F[u][v]);
for (u = T[v = N]; u; u = T[v = u])
F[u][v] += flux,
F[v][u] -= flux;
}
}
void write() {
int i,cnt;
for(cnt=0,i=1;i<=M;++i)
if(W[A[i]][B[i]]==3)++cnt;
cout<<cnt<<"\n";
for(i=1;i<=M;++i)
if(W[A[i]][B[i]]==3)
cout<<i<<"\n";
}
int main() {
read();
edmond_karp();
BFS(1,N,1);
BFS(N,1,2);
write();
return 0;
}