hdu 2686(状压dp)
2014-05-26 18:05
351 查看
题目链接:http://poj.org/problem?id=2686
思路:典型的状压dp题,dp[s][v]表示到达剩下的车票集合为S并且现在在城市v的状态所需要的最小的花费。
View Code
思路:典型的状压dp题,dp[s][v]表示到达剩下的车票集合为S并且现在在城市v的状态所需要的最小的花费。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define inf 1<<30 7 8 int n,m,p,a,b; 9 int t[11]; 10 int map[44][44]; 11 double dp[1<<11][44];//到达剩下的车票集合为S,并且现在在城市v的状态所需要的最小的花费 12 13 int main() 14 { 15 int u,v,w; 16 while(~scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)){ 17 if(n==0&&m==0&&p==0&&a==0&&b==0)break; 18 for(int i=0;i<m;i++) 19 for(int j=0;j<m;j++) 20 map[i][j]=(i==j)?0:inf; 21 for(int i=0;i<n;i++)scanf("%d",&t[i]); 22 while(p--){ 23 scanf("%d%d%d",&u,&v,&w); 24 map[u-1][v-1]=w; 25 map[v-1][u-1]=w; 26 } 27 for(int state=0;state<(1<<n);state++){ 28 fill(dp[state],dp[state]+m,inf); 29 } 30 dp[(1<<n)-1][a-1]=0; 31 double ans=inf; 32 for(int state=(1<<n)-1;state>=0;state--){ 33 ans=min(ans,dp[state][b-1]); 34 for(int u=0;u<m;u++){ 35 for(int i=0;i<n;i++){ 36 if((state>>i)&1){ 37 for(int v=0;v<m;v++){ 38 if(map[u][v]<inf&&dp[state][u]<inf){ 39 dp[state&~(1<<i)][v]=min(dp[state&~(1<<i)][v],dp[state][u]+(double)map[u][v]/t[i]); 40 } 41 } 42 } 43 } 44 } 45 } 46 if(ans==inf){ 47 puts("Impossible"); 48 }else 49 printf("%.3f\n",ans); 50 } 51 return 0; 52 } 53 54 55 56 57
View Code
相关文章推荐
- hdu 2686(状压dp)
- hdu 2686 Matrix 双线程dp
- HDU 4539 状压DP
- HDU 4084 Campus Design 状压dp
- hdu 2686 Matrix(双线程DP)
- HDU 1992Tiling a Grid With Dominoes(状压dp)
- hdu 2686 Matrix (多进程DP)
- hdu 4284(状压dp)
- hdu 4753 Fishhead’s Little Game(状压dp)
- hdu 4114(状压dp)
- HDU-2686 Matrix 双线程DP
- HDU 4539 状压DP
- hdu 4539(状压dp)
- hdu 1074 Doing Homework(状压dp)
- hdu 4739 Zhuge Liang's Mines(状压DP)
- hdu 4336 概率DP 状压DP
- hdu 2167(状压dp)
- HDU-2686 Matrix 多进程DP
- HDU 2686 Matrix (双线程DP)
- hdu 3001(状压dp)