POJ-2686-状态压缩

来源:互联网 发布:空间电压矢量 知乎 编辑:程序博客网 时间:2024/05/24 04:22

题目大意:旅行商问题加多了一个车票问题;

题目解析:dp[i][j]表示车票序列为i,当前地点在j的最少花费,然后dfs即可;最后答案一定要%f不能%lf无语。知道的朋友望解答;

AC代码:

DFS:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;const double inf=3010;int graph[31][31],n,m,a,b,t[10];double dp[1<<9][32],ans;const double eps = 1e-8;int vis[32];double dfs(int pos,int u){if(vis[u]==1)return inf;if(u==b){return 0.0;}if(dp[pos][u]>=0)return dp[pos][u];int i,j,k;double a=inf;vis[u]=1;for(i=1;i<=m;i++){if(graph[u][i]>=0){for(j=0;j<n;j++){if(pos&(1<<j)){a=min(a,dfs(pos&~(1<<j),i)+graph[u][i]*(1.0/t[j]));}}}}vis[u]=0;return dp[pos][u]=a;}int main(){int p,i,u,v,w;while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF&&n+m+p+a+b!=0){memset(vis,0,sizeof(vis));memset(graph,-1,sizeof(graph));for(i=0;i<n;i++){scanf("%d",&t[i]);}for(i=0;i<p;i++){scanf("%d%d%d",&u,&v,&w);graph[u][v]=graph[v][u]=w;}memset(dp,-1,sizeof(dp));ans=dfs((1<<n)-1,a);if(ans>=inf)printf("Impossible\n");else printf("%.3f\n",ans);}return 0;} 

循环:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;const double inf=0x3fffffff;int graph[32][32],n,m,a,b,t[10];double dp[1<<9][32],ans;int main(){int p,i,u,v,w,j,k;while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF&&n+m+p+a+b!=0){memset(graph,-1,sizeof(graph));for(i=0;i<n;i++){scanf("%d",&t[i]);}for(i=0;i<p;i++){scanf("%d%d%d",&u,&v,&w);graph[u][v]=graph[v][u]=w;}for(i=0;i<=(1<<n)-1;i++)for(j=0;j<=m+1;j++)dp[i][j]=inf;dp[(1<<n)-1][a]=0;ans=inf;for(i=(1<<n)-1;i>=0;i--){ans=min(ans,dp[i][b]);for(j=1;j<=m;j++){if(dp[i][j]<inf)for(k=0;k<n;k++){if(i&(1<<k)){for(p=1;p<=m;p++){if(graph[j][p]>=0){dp[i&~(1<<k)][p]=min(dp[i&~(1<<k)][p],dp[i][j]+(double)graph[j][p]/t[k]);}}}}}}if(ans==inf)printf("Impossible\n");else printf("%.3f\n",ans);}return 0;} 


0 0
原创粉丝点击