Spring suburban (DP-like water pressure problem)

Topic links:

https://ac.nowcoder.com/acm/problem/16122

Subject to the effect:

Chinese

Specific ideas:

First run again floyed FIG whole, and DP [i] [j] denotes the i th state to stop in the shortest distance to the point j.

AC Code:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define inf 0x3f3f3f3f
 5 #define LL_inf (1ll << 60)
 6 const int maxn = 200+55;
 7 const int mod = 1e9 + 7;
 8 int sto[maxn];
 9 int dp[34000][maxn];
10 int dis[maxn][maxn];
11 int n,m,r;
12 void floyed()
13 {
14     for(int i=1; i<=n; i++)
15     {
16         for(int j=1; j<=n; j++)
17         {
18             for(int k=1; k<= n; k++)
19             {
20                 dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]);
21             }
22         }
23     }
24 }
25 int main()
26 {
27   //  cout<<(1<<15)<<endl;
28     scanf("%d %d %d",&n,&m,&r);
29     for(int i=0; i<r; i++)
30     {
31         scanf("%d",&sto[i]);
32     }
33     for(int i=1; i<=n; i++)
34     {
35         for(int j=1; j<=n; j++)
36         {
37             if(i==j)
38                 dis[i][j]=0;
39             else
40                 dis[i][j]=inf ;
41         }
42     }
43     int st,ed,val;
44     for(int i=1; i<=m; i++)
45     {
46         scanf("%d %d %d",&st,&ed,&val);
47         //st--,ed--;
48         dis[st][ed]=min(dis[st][ed],val);
49         dis[ed][st]=dis[st][ed];
50     }
51     floyed();
52 //    for(int i=0;i<n;i++){
53 //    for(int j=i;j<n;j++){
54 //    cout<<i<<"  "<<j<<" "<<dis[i][j]<<endl;
55 //    }
56 //    }
57     memset(dp,inf,sizeof (dp) );
58     for(int i=0; i<r; i++)
59     {
60         dp[(1<<i)][i]=0 ;
61     }
62     int maxstate=(1<<r)-1;
63     for(int i=0; i<=maxstate; i++)
64     {
65         for(int j=0; j<r; j++)
66         {
67             if((i&(1<<j))==0)
68                 continue;
69             for(int k=0; k<r; k++)
70             {
71 //                if(i&(1<<k))
72  //                     continue; 
73                  DP [i ^ ( 1 << k)] [k] = min (DP [i ^ ( 1 << k)] [j] [i] [j] + DP dis [sto [j]] [sto [k]]);
74              }
 75          }
 76      }
 77      int minn = inf;
78      for ( int i = 0 ; i <r; i ++ )
     {
 80          minn = 79  min (Min, DP [maxstate] [i]);
81     }
 82      printf ( " % d \ n " , minn);
83 return       0;
84 }

 

Guess you like

Origin www.cnblogs.com/letlifestop/p/11079361.html