Cod sursa(job #2515262)

Utilizator david.teacaDavid Stefan Teaca david.teaca Data 28 decembrie 2019 11:20:02
Problema Trapez Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#include <algorithm>
#include <queue>
 
#define N 50 + 1
#define stare 1 << 20
 
using namespace std;
 
ifstream f ( "boom.in" );
ofstream g ( "boom.out" );
 
queue < int > q;
struct meme{
    int cost, code;
}v[N];
long long cost[stare];
int father[stare], used[stare], sol[N];
bool viz[stare];
 
void bfs ( int start, int m ){
    viz[start] = 1;
    q.push ( start );
    while ( ! q.empty ( ) ){
        int st = q.front ( );
        q.pop ( );
        viz[st] = 0;
        for ( int i = 1; i <= m; i++ ){
            int new_st = ( st & ( ~ v[i].code ) );
            int new_cost = cost[st] + v[i].cost;
            int left_st = ( new_st >> 1 ), right_st = ( new_st << 1 );
            if ( right_st > start )
                right_st -= ( start + 1 );
            new_st = left_st | right_st;
            if ( cost[new_st] > new_cost ){
                cost[new_st] = new_cost;
                used[new_st] = i;
                father[new_st] = st;
                if ( viz[new_st] == 0 ){
                    q.push ( new_st );
                    viz[new_st] = 1;
                }
            }
        }
    }
}
 
int reconst ( int x ){
    int k = 0;
    while ( father[x] != 0 ){
        sol[++k] = used[x];
        x = father[x];
    }
    return k;
}
 
int main()
{   int n, m, p;
    f >> n >> m;
    for ( int i = 1; i <= m; i++ ){
        f >> v[i].cost >> p;
        int code = 0, x;
        for ( int j = 1; j <= p; j++ ){
            f >> x;
            code = code + ( 1 << ( x - 1 ) );
        }
        v[i].code = code;
    }
    int max_stare = ( 1 << n ) - 1;
    for ( int i = 0; i < max_stare; i++ )
        cost[i] = max_stare;
    bfs ( max_stare, m );
    int length = reconst ( 0 );
    g << cost[0] << '\n' << length << '\n';
    for ( int i = length; i >= 1; i-- )
        g << sol[i] << '\n';
    return 0;
}