Cod sursa(job #3038589)

Utilizator BadHero112Ursu Vasile BadHero112 Data 27 martie 2023 15:58:57
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
using ll=long long;
#define S second
#define F first
#define endl '\n'
#define spid ios_base::sync_with_stdio(false);cin.tie(NULL);
const int mod=1e9+7;
const double pi=3.14159265359;
const int maxn=19;
using namespace std;

int m,n;

vector<vector<pair<int,int>>> A(maxn,vector<pair<int,int>>());

int dp[262144][19];

int main(){
	ifstream fin("hamilton.in");
	ofstream cout("hamilton.out");
	fin>>n>>m;
	for(int i=0;i<m;i++){
		int c1,c2,c3;
		fin>>c1>>c2>>c3;
		A[c2].push_back({c1,c3});
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<(1<<n);j++)dp[j][i]=1e9;
	}
	dp[1][0]=0;
	for(int k=0;k<(1<<n);k++){
		for(int i=0;i<n;i++){
			if(k&(1<<i)){
				for(int j=0;j<A[i].size();j++){
					if(k&(1<<A[i][j].F))dp[k][i]=min(dp[k][i],dp[k^(1<<i)][A[i][j].F]+A[i][j].S);
				}
			}
		} 
	}
	int mn=1e9;
	for(int i=0;i<A[0].size();i++){
		mn=min(mn,dp[(1<<n)-1][A[0][i].F]+A[0][i].S);
	}
	if(mn==1e9)cout<<"Nu exista solutie"<<endl;
	else cout<<mn<<endl;
}