POJ2686

Description:
\ (.. villes M, avec un p-coût route à deux voies est le numéro de la route de la distance de la route / n billet de billet donné, la recherche a-> b plus court chemin \) .

La vieille routine avait voulu commencer l'état de la ville de compression, mais la ville peut avoir jusqu'à 30, il est considéré comme la compression de billets.

Défini \ (DP [i] [j] \) pour les billets avec l'état i à l'heure actuelle est la ville d'arrivée le plus court j

Est initialisé à dp [0] [a] = 0, le transfert à la normale

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int n,m,p,a,b;
double d[39][39],v[39],dp[1<<9][39];
int main()
{
	while(cin>>n>>m>>p>>a>>b&&(n+m))
	{
		a--,b--;
		double ans=1e18;
		for(int i=0;i<=30;i++)for(int j=0;j<=30;j++)d[i][j]=9999999999999;
		for(int i=0;i<n;i++)	cin>>v[i];
		for(int i=0;i<p;i++)
		{
			int l,r;double w;
			cin>>l>>r>>w;l--,r--;
			d[l][r]=d[r][l]=w;
		}
		for(int i=0;i<(1<<9);i++)for(int j=0;j<=m;j++)dp[i][j]=99999999999;
		dp[0][a]=0;
		int len=(1<<n);
		for(int i=0;i<len;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(i&(1<<j))//这次用哪张票 
				{
					for(int q=0;q<m;q++)//当前在q城市
					{
						for(int k=0;k<m;k++)//从k城市转移而来 
						{
							if(q==k)	continue;	
						//	dp[i][q]=min(dp[i][q],dp[i-(1<<j)][k]+d[q][k]/v[j]);
							dp[i][k]=min(dp[i][k],dp[i-(1<<j)][q]+d[q][k]/v[j]);
							if(k==b)	
								ans=min(ans,dp[i][k]);
						}	
					} 
				}
			}
		}
		if(ans>=99999999998)	cout<<"Impossible"<<endl;
		else printf("%.3lf\n",ans);
	}
}

Je suppose que tu aimes

Origine www.cnblogs.com/iss-ue/p/12612147.html
conseillé
Classement