Cod sursa(job #2696315)

Utilizator VarothexVartic Mihai-Vlad Varothex Data 15 ianuarie 2021 18:16:35
Problema Critice Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <vector>
#include <string>
#include <queue>
#include <climits>
#include <algorithm>
#define INF LONG_MAX

using namespace std;

ifstream fin("teroristi.in");
ofstream fout("teroristi.out");

long n, m, S, D, c[30*30][30*30], f[30*30][30*30], frec[30*30], ind[30*30][20000];
vector<long> t, cr;
string ss;

bool BF()
{
	queue<long> Q;
	vector<int> s(D+1);
	t.assign(D+1, 0);
	cr.assign(D+1, 0);
	s[S] = 1;
	cr[S] = INF;
	Q.push(S);
	while (!Q.empty())
	{
		int i = Q.front();
		Q.pop();
		for (int j = S; j <= D; ++j)
		{
			if (s[j])
            {
                continue;
            }
			if (c[i][j] > f[i][j])
			{
			    cr[j] = min(cr[i], c[i][j] - f[i][j]);
				s[j] = true;
				t[j] = i;
				Q.push(j);
				if (j == D)
                {
                    return true;
                }
			}
		}
	}
	return false;
}

int main()
{
	fin >> n >> m;
	fin >> ss;
	for (int i = 0; i < ss.size(); ++i)
		frec[ss[i]-'a'+1]++;
	char ch1, ch2;
	int x, y;
	for (int i = 1; i <= m; ++i)
	{
		fin >> ch1 >> ch2;
		x = ch1-'a'+ 1;
		y = ch2-'a'+ 1;
		if (y < x) swap(x,y);
		int nod = x*26 + y;
		frec[nod]++;
		ind[nod][frec[nod]] = i;
		c[x][nod] = INF;
		c[y][nod] = INF;
	}

	S = 0; D = 703;
	for (int i = 1; i <= 26; ++i)
		c[S][i] = frec[i];
	for (int i = 27; i <= 702; ++i)
		c[i][D] = frec[i];

    while (BF())
    {
        int ii, jj;
        jj = D;
        while (jj != S)
        {
            ii = t[jj];
            f[ii][jj] += cr[D];
            f[jj][ii] -= cr[D];
            jj = ii;
        }
    }

    for (int i = 0; i < ss.size(); ++i)
	{
		int poz = ss[i] - 'a' + 1;
		for (int j = 27; j <= 702; ++j)
			if (f[poz][j])
			{
				fout << ind[j][frec[j]] << ' ';

                frec[j]--;
				f[poz][j]--;

				break;
			}
	}

	return 0;
}