Cod sursa(job #1915746)

Utilizator danysilas23Silas Daniel danysilas23 Data 8 martie 2017 22:21:28
Problema Critice Scor 70
Compilator cpp Status done
Runda becreative29 Marime 1.71 kb
#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=10241;
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;
}