Cod sursa(job #1853491)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 21 ianuarie 2017 20:23:21
Problema Gather Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#define MAXN 760
#define MAXK 16
#define inf 0x3f3f3f3f

using namespace std;

int dk[MAXK], best[MAXN], cost[MAXN][MAXN], cap[MAXN][MAXN];
int dist[MAXK][MAXK][MAXK];
int n, k, m;
vector<int> graf[MAXN];
struct cmp
{
    bool operator()(const int &x, const int &y)
    {
        return best[x] > best[y];
    }
};
priority_queue<int, vector<int>, cmp> heap;

void dijkstra(int src, int capmin)
{
    for (int i = 0; i <= n; i++)
        best[i] = inf;
    best[dk[src]] = 0;
    heap.push(dk[src]);
    while (!heap.empty())
    {
        int nod = heap.top();
        heap.pop();
        for (int y : graf[nod])
            if (cap[nod][y] >= capmin && best[nod] + cost[nod][y] < best[y])
            {
                best[y] = best[nod] + cost[nod][y];
                heap.push(y);
            }
    }
    for (int i = 1; i <= k; i++)
        dist[capmin][src][i] = best[dk[i]];
}

int din[1<<MAXK][MAXK]; /// dist min pentru a ajunge la nodul j cu prizionierii i

int cati(int nr)
{
    int rez = 0;
    while (nr)
    {
        rez += nr & 1;
        nr >>= 1;
    }
    return rez;
}

void solve()
{
    for (int i = 0; i < (1<<MAXK); i++)
        for (int j = 0; j < MAXK; j++)
            din[i][j] = inf;
    din[1][0] = 0;
    for (int i = 0; i < (1<<MAXK); i++)
    {
        for (int j = 0; j < MAXK; k++)
        {
            if (!(i & (1 << j))) continue;
            for (int v = 0; v < MAXK; v++)
                if (i!= v && (i & (1<<v)))
                {
                    int c = cati(i^(1<<v));
                    din[i][j] = min(din[i][j], din[i^(1<<v)][v] + dist[c][v+1][j+1] * c);
                }
        }
    }
    int sol = inf;
    for (int i = 0; i < MAXK; i++)
        sol = min(sol, din[(1<<MAXK)-1][i]);
}

int main()
{
    freopen("gather.in", "r", stdin);
    freopen("gather.out", "w", stdout);

    printf("Helo");

//    scanf("%d %d %d", &k, &n, &m);
//    for (int i = 1; i <= k; i++) {
//        scanf("%d", &dk[i]);
//        //cdk[dk[i]] = i;
//    }
//    for (int i = 1; i <= m; i++) {
//        int a, b, c, d;
//        scanf("%d %d %d %d", &a, &b, &c, &d);
//        graf[a].push_back(b);
//        graf[b].push_back(a);
//        cost[a][b] = cost[b][a] = c;
//        cap[a][b] = cap[b][a] = d;
//    }
//    for (int i = 1; i <= k; i++)
//        for (int j = 0; j <= k; j++)
//            dijkstra(i, j);
//    solve();

    return 0;
}