Advertisement
Guest User

Untitled

a guest
Nov 30th, 2015
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. //#include <cstdlib>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include <map>
  6. #include<vector>
  7. using namespace std;
  8. int dp1[(1<<20)+1][22];
  9. int dp2[(1<<20)+1][22];
  10. int adj[22][22];
  11. int ans=1000000000;
  12. int a[100];
  13. int tot;
  14. int n;
  15. void solve(int id)
  16. {
  17.     if (id==n-1)
  18.     {
  19.         int num=0;
  20.         int x=0;
  21.         for (int i=1;i<=n-2;i++)
  22.             num+=a[i],x+=a[i]*(1<<(i-1));
  23.         if (num==(n-2)/2)
  24.         {
  25.             int mn1=1000000000;
  26.             int mn2=1000000000;
  27.             for (int i=1;i<=n-2;i++)
  28.             {
  29.                 for (int j=1;j<=n-2;j++)
  30.                 {
  31.                     mn1=min(mn1,dp1[x][i]+dp2[tot-x][j]+adj[i][j]);
  32.                     mn2=min(mn2,dp2[x][i]+dp1[tot-x][j]+adj[i][j]);
  33.                 }
  34.             }
  35.             ans=min(ans,mn1+mn2);
  36.         }
  37.     }
  38.     else
  39.     {
  40.         a[id]=1;
  41.         solve(id+1);
  42.         a[id]=0;
  43.         solve(id+1);
  44.     }
  45. }
  46. int main()
  47. {
  48.     int c=1;
  49.     while(cin>>n)
  50.     {
  51.         ans=1000000000;
  52.         int m;
  53.         cin>>m;
  54.         for (int i=0;i<n;i++)
  55.             for (int j=0;j<n;j++)
  56.                 adj[i][j]=1000000000;
  57.         for (int i=0;i<m;i++)
  58.         {
  59.             int a,b,c;
  60.             cin>>a>>b>>c;
  61.             adj[a][b]=adj[b][a]=c;
  62.         }
  63.         for (int k=0;k<n;k++)
  64.             for (int j=0;j<n;j++)
  65.                 for (int i=0;i<n;i++)
  66.                     adj[j][i]=min(adj[j][i],adj[j][k]+adj[k][i]);
  67.         tot=(1<<(n-2))-1;
  68.         for (int i=0;i<=n;i++)
  69.             for (int j=0;j<=tot;j++)
  70.                 dp2[j][i]=dp1[j][i]=1000000000;
  71.         dp1[0][0]=0;
  72.         dp2[0][n-1]=0;
  73.         for (int i=1;i<=tot;i++)
  74.         {
  75.             int h=i;
  76.             for (int j=1;j<=n-2;j++)
  77.             {
  78.                 int u=h%2;
  79.                 h/=2;
  80.                 if (u)
  81.                 {
  82.                     for (int x=0;x<=n-2;x++)
  83.                         dp1[i][j]=min(dp1[i][j],dp1[i-(1<<(j-1))][x]+adj[x][j]);
  84.                     for (int x=1;x<=n-1;x++)
  85.                         dp2[i][j]=min(dp2[i][j],dp2[i-(1<<(j-1))][x]+adj[x][j]);
  86.                 }
  87.             }
  88.         }
  89.         solve(1);
  90.         cout<<"Case "<<c++<<": ";
  91.         cout<<ans<<endl;
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement