Cod sursa(job #606239)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 3 august 2011 18:11:00
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.73 kb
# include <fstream>
# include <cstring>
# include <vector>
# include <queue>
using namespace std;

ifstream f ("senat.in");
ofstream g ("senat.out");

vector <int> A[701];
int n, m, ind, s, F[701][701], C[701][701], start, finish, dmin[701], flow;
char sir[7000], c;
queue <int> Q;

int read (int &i, int s)
{
    int nr = 0;
    while (!(sir[i] >= '0' && sir[i] <= '9') && i < s) ++i;
    while (sir[i] >= '0' && sir[i] <= '9' && i < s)
        nr = nr * 10 + sir[i] - '0', ++i;
    if (nr > 0) return nr;
}

int BFs ()
{
    memset (dmin, 0, sizeof (dmin));
    Q.push (start);
    for (; !Q.empty (); Q.pop ())
    {
        int ret = Q.front ();
        for (vector <int> :: iterator it = A[ret].begin (); it != A[ret].end (); ++it)
            if (F[ret][*it] < C[ret][*it] && !dmin[*it])
                dmin[*it] = ret, Q.push (*it);
    }
    return dmin[finish];
}
int main ()
{
    f >> n >> m;
    c = f.get ();
    while (c != '\n') c = f.get ();

    start = n + m + 2; finish = n + m + 1;
    for (int i = 1; i <= n; ++i)
        A[start].push_back (i), A[i].push_back (start), C[start][i] = 1;
    for (int i = 1; i <= m; ++i)
    {
        f.get (sir, 6999);
        c = f.get ();
        while (c != '\n' && i != m) c = f.get ();
        for (ind = 0, s = strlen (sir); ind < s; )
        {
            int nr = read (ind, s);
            A[nr].push_back (i + n);
            A[i + n].push_back (nr);
            C[nr][i + n] = 1;
        }
        A[i + n].push_back (finish);
        A[finish].push_back (i + n);
        C[i + n][finish] = 1;
    }

    for (; BFs () > 0; )
    {
        for (vector <int> :: iterator it = A[finish].begin (); it != A[finish].end (); ++it)
        {
            if (F[*it][finish] < C[*it][finish] && dmin[*it])
            {
                int maxflow = C[*it][finish] - F[*it][finish];
                for (int i = *it; i != start && maxflow > 0; i = dmin[i])
                    maxflow = min (maxflow, C[dmin[i]][i] - F[dmin[i]][i]);
                if (!maxflow) continue ;
                F[*it][finish] += maxflow;
                F[finish][*it] -= maxflow;
                for (int i = *it; i != start; i = dmin[i])
                    F[dmin[i]][i] += maxflow, F[i][dmin[i]] -= maxflow;
            }
        }
    }
    for (int i = n + 1, nm = n + m; i <= nm; ++i)
        flow += F[i][finish];
    if (flow != m)
        g << "0\n";
    else
    {
        for (int i = n + 1, nm = n + m; i <= nm; ++i)
        {
            for (int j = 1; j <= n; ++j)
                if (F[j][i] > 0)
                {
                    g << j << '\n';
                    break ;
                }
        }
    }
    g.close ();
    return 0;
}