Pagini recente » Cod sursa (job #3136434) | Cod sursa (job #1754635) | Cod sursa (job #2908141) | Cod sursa (job #1852322) | Cod sursa (job #2515262)
#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;
}