Mai intai trebuie sa te autentifici.
Cod sursa(job #1165439)
Utilizator | Data | 2 aprilie 2014 18:10:41 | |
---|---|---|---|
Problema | Ciclu hamiltonian de cost minim | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.4 kb |
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
#define Nmax 20
using namespace std;
int N, M;
vector<pair<int,int> > G[Nmax];
int DP[1<<18][Nmax]; /// DP[i][j] -> costul de a trece prin masca j si a termina pe nodul i
void read()
{
scanf("%d%d",&N,&M);
int a,b,c;
for(int i = 1; i <= M; ++i)
{
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(make_pair(c,b));
}
}
void solve()
{
memset(DP,INF,sizeof(DP));
DP[1][0] = 0;
for(int mask = 0; mask < ( 1<<N ); ++mask) /// luam toate configuratiile
for(int j = 0; j < N; ++j)
if(mask &(1<<j)) /// daca exista nodul j in masca
for(vector<pair<int,int> >::iterator it = G[j].begin(); it != G[j].end(); ++it)
if(mask & (1 << (it->second) )) /// si exista si nodul *it presupunem ca venim de acolo
DP[mask][j] = min(DP[mask][j], DP[mask^(1<<j)][it->second] + it->first);
int ans = INF;
for(vector<pair<int,int> >::iterator it = G[0].begin(); it != G[0].end(); ++it)
ans = min(ans, DP[(1<<N)-1][it->second] + it->first);
if(ans != INF)
printf("%d\n",ans);
else
printf("Nu exista solutie"); /// mda
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
read();
solve();
return 0;
}