UVa 590 Always on the run

 1  #include <stdio.h>
 2  #include <stdlib.h>
 3  #include <iostream>
 4  #include <algorithm>
 5  #include <map>
 6  #include <vector>
 7  using namespace std;
 8  typedef pair<int,int> ii;
 9  int main()
10  {
11      int n,k,cas=1;
12      while(cin>>n>>k && n!=0 || k!=0)
13      {
14          map<ii,vector<int> > m;
15          for(int i=1; i<=n; i++)
16          {
17              for(int j=1; j<=n; j++)
18              {
19                  if(i!=j)
20                  {
21                      int tmp,tmpf;
22                      cin>>tmp;
23                      m[ii(i,j)].push_back(tmp);
24                      for(int c=0; c<tmp; c++)
25                      {
26                          cin>>tmpf;
27                          m[ii(i,j)].push_back(tmpf);
28                      }
29                  }
30              }
31          }
32          int dp[1005][15];
33          for(int i=0; i<=k; i++)
34          {
35              for(int j=0; j<=n; j++) dp[i][j]=100000000;
36          }
37          dp[0][1]=0;
38          for(int i=1; i<=k; i++)
39          {
40              for(int j=1; j<=n; j++)
41              {
42                  for(int f=1; f<=n; f++)
43                  {
44 
45                      if(f!=j && ((i==1 && j!=1 && f==1) || (i>1)))
46                      {
47                          ifi<=m[ii(f,j)][0] && m[ii(f,j)][i]!=0 )
48                          {
49                              dp[i][j]=min(dp[i][j],dp[i-1][f]+m[ii(f,j)][i]);
50                          }
51                          else if( i>m[ii(f,j)][0] && i%(m[ii(f,j)][0])==0 && m[ii(f,j)][i%(m[ii(f,j)][0])+(m[ii(f,j)][0])]!=0)
52                          {
53                              dp[i][j]=min(dp[i][j],dp[i-1][f]+m[ii(f,j)][i%(m[ii(f,j)][0])+(m[ii(f,j)][0])]);
54                          }
55                          else if( i>m[ii(f,j)][0] && i%(m[ii(f,j)][0])!=0 && m[ii(f,j)][i%(m[ii(f,j)][0])]!=0)
56                          {
57                              dp[i][j]=min(dp[i][j],dp[i-1][f]+m[ii(f,j)][i%(m[ii(f,j)][0])]);
58                          }
59                      }
60                  }
61              }
62          }
63          printf("Scenario #%d\n",cas++);
64          if(dp[k][n]!=100000000) printf("The best flight costs %d.\n",dp[k][n]);
65          else printf("No flight possible.\n");
66          cout<<endl;
67      }
68      return 0;

69  }

留言

這個網誌中的熱門文章

Things a Little Bird Told Me: Confessions of the Creative Mind

UVa 12970 Alcoholic Pilots

UVa 483 Word Scramble