Cod sursa(job #2095717)

Utilizator DawlauAndrei Blahovici Dawlau Data 28 decembrie 2017 08:21:19
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#include<list>
#include<climits>
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
const int NMAX=19,INF=18000000;
list<int>g[NMAX];
int cost[NMAX][NMAX],chain[1<<NMAX][NMAX],n,m;
void read_data(){
    fin>>n>>m;
    int from,to,c;
    while(m--){
        fin>>from>>to>>c;
        g[to].push_back(from);
        cost[from][to]=c;
    }
}
int minCost(){
    int mask,node;
    list<int>::iterator it;
    for(mask=0;mask<(1<<n);++mask)
        for(node=0;node<n;++node)
            chain[mask][node]=INF;
    chain[1][0]=0;
    for(mask=0;mask<(1<<n);++mask)
        for(node=0;node<n;++node)
            if(mask&(1<<node))
                for(it=g[node].begin();it!=g[node].end();++it)
                    if(mask&(1<<*it))
                        chain[mask][node]=min(chain[mask][node],chain[mask^(1<<node)][*it]+cost[*it][node]);
    int mincost=INF;

    return mincost;
}
int main(){
    read_data();
    int x=minCost();
    if(x==INF)
        fout<<"Nu exista solutie";
    else
        fout<<x;
}