Pagini recente » Cod sursa (job #1623118) | Cod sursa (job #2275852) | Cod sursa (job #3131440) | Cod sursa (job #661574) | Cod sursa (job #834450)
Cod sursa(job #834450)
#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;
}