Cod sursa(job #1462682)

Utilizator jul123Iulia Duta jul123 Data 18 iulie 2015 18:02:24
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include<bits/stdc++.h>

using namespace std;

int n;
queue<int> q;
vector<int> v[1005], ans;
vector<pair<int, int> >e;

int viz[1005], f[1005][1005], c[1005][1005], tata[1005];
int mark1[1005];
int mark2[1005];

int dfs(int nod, int m[]) {
    m[nod] = 1;
    for(int i = 0; i < v[nod].size(); ++i)
        if(m[v[nod][i]] == 0 && c[nod][v[nod][i]] != f[nod][v[nod][i]])
            dfs(v[nod][i], m);
}

int bfs() {
    for(int i = 0; i < n; ++i)
        viz[i] = 0;
    q.push(0);
    viz[0] = 1;
    while(!q.empty()) {
        int x = q.front();
        q.pop();
        if(x != n - 1) {
            for(int i = 0; i < v[x].size(); ++i) {
                if(viz[v[x][i]] == 0 && f[x][v[x][i]] != c[x][v[x][i]]) {
                    q.push(v[x][i]);
                    viz[v[x][i]] = 1;
                    tata[v[x][i]] = x;
                }
            }
        }
    }
    return viz[n - 1];
}

int main()
{
    int m, a, b, d;
    FILE *fin = fopen("critice.in", "r");
    FILE *fout = fopen("critice.out", "w");

    fscanf(fin, "%d %d", &n, &m);

    for(int i = 0; i < m; ++i) {
        fscanf(fin, "%d %d %d", &a, &b, &d);
        --a; --b;
        v[a].push_back(b);
        v[b].push_back(a);
        c[a][b] = d;
        c[b][a] = d;
        e.push_back(make_pair(a, b));
    }

    while(bfs()) {
        for(int j = 0; j < v[n - 1].size(); ++j) {
            int nod = v[n - 1][j];
            if(viz[nod] == 1 && f[nod][n - 1] != c[nod][n - 1]) {
                tata[n - 1] = nod;
                int minim = 20000;
                for(int i = n - 1; i != 0; i = tata[i])
                    if(minim > c[tata[i]][i] - f[tata[i]][i])
                        minim = c[tata[i]][i] - f[tata[i]][i];
                if(minim != 0) {
                    for(int i = n - 1; i != 0; i = tata[i]) {
                        f[tata[i]][i] += minim;
                        f[i][tata[i]] -= minim;
                    }
                }

            }
        }
    }
    dfs(0, mark1);
    dfs(n - 1, mark2);

    for(int i = 0; i < m; ++i) {
        a = e[i].first;
        b = e[i].second;
        if(((f[a][b] == c[a][b]) || (f[b][a] == c[b][a])) && ((mark1[a] == 1 && mark2[b] == 1)|| (mark2[a] == 1 && mark1[b] == 1)))
            ans.push_back(i + 1);
    }
    fprintf(fout, "%d\n",  ans.size());
    for(int i = 0; i < ans.size(); ++i)
        fprintf(fout, "%d\n",  ans[i]);


}