Cod sursa(job #2099029)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 3 ianuarie 2018 21:08:10
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.71 kb
#include <bits/stdc++.h>
#define MAXN 1000
#define MAXM 10000
#define INF 1000000000

#define BUF_SIZE 1 << 14
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi,*fo;
inline char nextch(){
    if(pbuf==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fi);
        pbuf=0;
    }
    return buf[pbuf++];
}
inline int nextnum(){
    int a = 0;
    char c = nextch();
    while(!isdigit(c))
        c = nextch();
    while(isdigit(c)){
        a = a * 10 + c - '0';
        c = nextch();
    }
    return a;
}

int S, D;
std::vector <int> G[1 + MAXN];
std::vector <int> V;
int C[1 + MAXN][1 + MAXN];
int F[1 + MAXN][1 + MAXN];
int I[1 + MAXN][1 + MAXN];

int q[1 + MAXN];
int father[1 + MAXN];
int viz[1 + MAXN];
int bfs(){
    q[0] = 1;
    q[1] = S;
    viz[S] = 1;

    for(int i = 1; i <= q[0]; i++){
        int node = q[i];
        if(node != D)
            for(int j = 0; j < G[node].size(); j++){
                int vecin = G[node][j];
                if(!viz[vecin] && C[node][vecin] != F[node][vecin]){
                    viz[vecin] = 1;
                    q[++q[0]] = vecin;
                    father[vecin] = node;
                }
            }
        if(viz[D])
            return viz[D];
    }

    return viz[D];
}
void bfs2(){
    q[0] = 1;
    q[1] = D;
    viz[D] = 2;

    for(int i = 1; i <= q[0]; i++){
        int node = q[i];
        for(int j = 0; j < G[node].size(); j++){
            int vecin = G[node][j];
            if(!viz[vecin] && C[node][vecin] != F[node][vecin]){
                viz[vecin] = 2;
                q[++q[0]] = vecin;
                father[vecin] = node;
            }
        }
    }
}

int main(){
    fi = fopen("critice.in","r");
    fo = fopen("critice.out","w");

    int n = nextnum(), m = nextnum();
    for(int i = 1; i <= m; i++){
        int x = nextnum(), y = nextnum(), z = nextnum();
        I[x][y] = i;
        I[y][x] = i;
        C[x][y] += z;
        C[y][x] += z;

        G[x].push_back(y);
        G[y].push_back(x);
    }
    S = 1;
    D = n;

    int flow = 0;
    while(bfs()){
        for(int i = 0; i < G[D].size(); i++){
            int node = G[D][i];
            if(viz[node] && C[node][D] != F[node][D]){
                father[D] = node;

                int fmin = INF;
                for(int node = D; node != S; node = father[node])
                    fmin = std::min(fmin, C[father[node]][node] - F[father[node]][node]);
                if(fmin != 0)
                    for(int node = D; node != S; node = father[node]){
                        F[father[node]][node] += fmin;
                        F[node][father[node]] -= fmin;
                    }
                flow += fmin;
            }
        }
        memset(viz, 0, sizeof(viz));
    }

    /*for(int i = 1; i <= n; i++)
        for(auto j: G[i])
            if(I[i][j]){
                C[i][j]++;
                C[j][i]++;
                if(bfs()) V.push_back(I[i][j]);
                C[i][j]--;
                C[j][i]--;
            }
    fprintf(fo,"%d\n", V.size() / 2);
    std::sort(V.begin(), V.end());
    int prev = 0;
    for(int i = 0; i < V.size(); i++)
        if(V[i] != prev){
            fprintf(fo,"%d\n", V[i]);
            prev = V[i];
        }*/
    bfs();
    bfs2();
    for(int i = 1; i <= n; i++)
        for(auto j: G[i])
            if(viz[i] + viz[j] == 3)
                V.push_back(I[i][j]);
    fprintf(fo,"%d\n", V.size() / 2);
    std::sort(V.begin(), V.end());
    int prev = 0;
    for(int i = 0; i < V.size(); i++)
        if(V[i] != prev){
            fprintf(fo,"%d\n", V[i]);
            prev = V[i];
        }

    fclose(fi);
    fclose(fo);
    return 0;
}