Cod sursa(job #834450)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 14 decembrie 2012 13:27:11
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>

#define pb push_back
#define mp make_pair

using namespace std;

ifstream in("hamilton.in");
ofstream out("hamilton.out");

int n,m;

const int N=19;
const int INF=1<<30;

vector <pair<int,int> > graph[N];

int ad[N+1][N+1];

int dp[1<<(N+1)][N+5]; // dp[i][j] costu pentru submultimea i cu ultimul element j

void read(){
	int x,y,c,i;
	in>>n>>m;
	for(i=1;i<=m;++i){
		in>>x>>y>>c;
		graph[x].pb(mp(y,c));
		ad[x][y]=c;
	}
}

void solve(){
	int i,j,k;
	int subtotal=0;
	for(i=0;i<n;++i){
	    subtotal+=(1<<i);
	}
	for(i=1;i<=subtotal;++i){
		for(j=0;j<n;++j){
			dp[i][j]=INF;
		}
	}
	dp[1][0]=0;
	int vecin,cost,submultime;
	for(i=1;i<=subtotal;++i){
		for(j=0;j<n;++j){
		    if(dp[i][j]==INF)
                continue;
			for(k=0;k<graph[j].size();++k){
				vecin=graph[j][k].first;
				cost=graph[j][k].second;
				if(!((1<<vecin) & i)){
					submultime=i+ (1<<vecin);
					dp[submultime][vecin]=min(dp[submultime][vecin],dp[i][j]+cost);
				}
			}
		}
	}
	int costmin=INF;
	for(i=0;i<n;++i){
		if(ad[i][0] && dp[subtotal][i] + ad[i][0]<costmin){
			costmin= dp[subtotal][i]+ ad[i][0];
		}
	}
	if(costmin==INF){
        out<<"Nu exista solutie";
        return;
	}
	out<<costmin;
}

int main(){
	read();
	solve();
	return 0;
}