Advertisement
Es7evam

CaixeiroViajante-C

Jun 1st, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define inf 99999999
  5.  
  6. int dfs(int *pai, int **M, long long bitmask,int n,int last,int ret){
  7.     int mn=inf;
  8.     int i;
  9.     for(i=0;i<n;i++){
  10.         if(M[last][i]){
  11.             if((bitmask&(1LL<<i))>0){
  12.                 int val=dfs(pai, M, bitmask-(1LL<<i),n,i,ret)+ M[last][i];
  13.                 if(mn>val){
  14.                     mn = val;
  15.                     pai[last]=i;
  16.                 }
  17.             }
  18.         }
  19.     }
  20.     if(bitmask==0){
  21.         pai[last]=ret;
  22.         return M[last][ret];
  23.     }
  24.     return mn;
  25. }
  26.  
  27. int main(){
  28.     int n,i,j;
  29.     scanf("%d", &n);
  30.     int **M = malloc(n * sizeof(int *));
  31.     int *pai = malloc(n* sizeof(int));
  32.     for(i = 0; i < n; i++)
  33.         M[i] = malloc(n * sizeof(int));
  34.    
  35.     for(int i=0;i<n;i++){
  36.         for(int j=0;j<n;j++){
  37.             scanf("%d", &M[i][j]);
  38. //          if(M[i][j] == 0){
  39. //              M[i][j] = inf;
  40. //          }
  41.         }
  42.     }
  43.     int bitmask = (1LL << n) - 1;
  44.     int resp = inf;
  45.     int id=0;
  46.     int val;
  47.     for(i=0;i<n;i++){
  48.         val = dfs(pai, M, bitmask-(1LL<<i),n,i,i);
  49.         if(resp > val){
  50.             resp = val;
  51.             id = i;
  52.         }
  53.     }
  54.     dfs(pai, M, bitmask-(1LL<<id),n,id,id);
  55.     i = id;
  56.     printf("Caminho: %d ", id);
  57.     i=pai[i];
  58.     while (i != id){
  59.         printf("-> %d ", i);
  60.         i = pai[i];
  61.     }
  62.         printf("\nTamanho : %d\n", resp);
  63.  
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement