Traveling by Stagecoach POJ 2686

用二進制表示你手上有哪些票,用掉一張就在對應二進制位置上把1變0

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int maxn=31;
const int INF=0x3f3f3f;
 
int n,m,p,a,b;
int t[maxn];
int map[maxn][maxn];
 
double dp[1<<10][maxn];// 
 
int main()
{
    while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF)
	{
        if(!n&&!m)
        break;
        memset(map,0,sizeof(map));
        for (int i=0;i<n;i++)
            scanf("%d",&t[i]);
        for (int i=0;i<p;i++)
		{
            int u,v,c;
            scanf("%d%d%d",&u,&v,&c);
            map[u][v]=map[v][u]=c;
        }
    	for (int i=0;i<(1<<n);i++)
        fill(dp[i],dp[i]+m+1,INF);
	    dp[(1<<n)-1][a]=0;
	    double res=INF;
	    for (int i=(1<<n)-1;i>=0;i--)
	        for (int u=1;u<=m;u++)//下一個城市 
	            for (int j=0;j<n;j++)
	                if (i&(1<<j))
	                    for (int v=1;v<=m;v++)//現在所在的城市 
	                        if (map[v][u])
	                            //使用車票j,並更新狀態,從v移動到u
	                            dp[i&~(1<<j)][v]=min(dp[i&~(1<<j)][v],dp[i][u]+(double)map[u][v]/t[j]);
	    for(int i=0;i<(1<<n);i++)
	        res=min(res,dp[i][b]);
	    if(res==INF)
	        printf("Impossible\n");
	    else
	        printf("%.3f\n",res);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章