Advertisement
RaFiN_

travelling salesman

Mar 16th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 1.94 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int bitOn(int N,int pos){return N=N | (1<<pos);}
  5. bool bitCheck(int N,int pos){return (bool)(N & (1<<pos));}
  6.  
  7. int n,m,dp[(1<<16)+5],dist[20][20],d[20];
  8.  
  9. int giveres(int mask)
  10. {
  11.    if(__builtin_popcount(mask)==n)return 0;
  12.    if(dp[mask]!=-1)return dp[mask];
  13.    int ans=INT_MAX/10;
  14.    for(int i=0;i<n;i++)
  15.    {
  16.        if(!bitCheck(mask,i))
  17.        {
  18.            int temp=bitOn(mask,i);
  19.            for(int j=0;j<n;j++)
  20.            {
  21.                if(!bitCheck(temp,j))
  22.                {
  23.                    ans=min(ans,giveres(bitOn(temp,j))+dist[i][j]);
  24.                }
  25.            }
  26.        }
  27.  
  28.    }
  29.  
  30.    return dp[mask]=ans;
  31. }
  32.  
  33. int main()
  34. {
  35.    int t;
  36.    scanf("%d",&t);
  37.    for(int q=0;q<t;q++)
  38.    {
  39.       memset(d,0,sizeof(d));int ans=0;
  40.        scanf("%d%d",&n,&m);
  41.        for(int i=0;i<=15;i++)
  42.        {
  43.            for(int j=0;j<=15;j++)
  44.            {
  45.                if(i!=j)dist[i][j]=INT_MAX/10;
  46.                else dist[i][j]=0;
  47.            }
  48.        }
  49.        for(int i=0;i<m;i++)
  50.        {
  51.            int a,b,c;
  52.            scanf("%d%d%d",&a,&b,&c);
  53.            a--;b--;
  54.            d[a]++;
  55.            d[b]++;
  56.            dist[a][b]=min(dist[a][b],c);
  57.            dist[b][a]=dist[a][b];
  58.            ans+=c;
  59.        }
  60.  
  61.        for(int k=0;k<n;k++)
  62.        {
  63.            for(int i=0;i<n;i++)
  64.            {
  65.                for(int j=0;j<n;j++)
  66.                {
  67.                    if(dist[i][k]+dist[k][j]<dist[i][j])
  68.                    {
  69.                        dist[i][j]=dist[i][k]+dist[k][j];
  70.                    }
  71.                }
  72.            }
  73.        }
  74.        int mask=0;
  75.        memset(dp,-1,sizeof(dp));
  76.        for(int i=0;i<n;i++)
  77.        {
  78.            if(d[i]%2==0)
  79.                mask=bitOn(mask,i);
  80.        }
  81.  
  82.        int x=giveres(mask)+ans;
  83.        printf("Case %d: %d\n",q+1,x);
  84.  
  85.  
  86.    }
  87.  
  88.    return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement