POJ 2686 Traveling by Stagecoach

来源:互联网 发布:天正建筑软件学习 编辑:程序博客网 时间:2024/05/16 04:45
//状态压缩实际上是将一个集合用一个数来表示#include<stdio.h>#include<string>#include<vector>using namespace std;#define INF 1<<30#define MAX_N 10#define MAX_M 40//输入int n,m,a,b,p;int t[MAX_N];int d[MAX_M][MAX_M];//图的邻接矩阵表示(-1表示没有边)//dp[S][v]:=到达剩下的车票集合为S并且现在在城市v的状态所需要的最小花费double dp[1<<MAX_N][MAX_M];double min(double a,double b) {return a<b?a:b;}void solve() {int i,u,v,S;for(i=0;i< (1<<n);i++) {fill(dp[i],dp[i]+m,INF);//用足够大的值初始化}dp[(1<<n)-1][a-1]=0;double res=INF;for(S=(1<<n)-1;S>=0;S--) {res=min(res,dp[S][b-1]);for(v=0;v<m;v++) {for(i=0;i<n;i++) {if (S>>i &1) {for(u=0;u<m;u++) {if (d[v][u]>=0) {//使用车票i,从v移动到udp[S& ~(1<<i)][u]=min(dp[S&~(1<<i)][u],dp[S][v]+(double)d[v][u]/t[i]);}}}}}}if (res==INF) {//无法到达printf("Impossible\n");}else {printf("%.3f\n",res);}}int main() {#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifint i,x,y,z;while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF && n!=0) {memset(d,-1,sizeof(d));for(i=0;i<n;i++) scanf("%d",&t[i]);for(i=0;i<p;i++) {scanf("%d%d%d",&x,&y,&z);d[x-1][y-1]=z;//无向图d[y-1][x-1]=z;}solve();}return 0;}

0 0
原创粉丝点击