Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

状态压缩,附代码一份

Posted by phython at 2017-03-07 19:48:50 on Problem 2686
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; 
int n,m,p,a,b;
int tickets[20];
const double INF = 1e9;
struct edge{
	int u,v,cost,next;
}Edge[1000];
double dp[1<<10][50];//dp[S][v]到位置v且还剩S的票的最小值 
int cnt;
int head[1000];
void add_edge(int u,int v,int cost)
{
	Edge[cnt].u = u;
	Edge[cnt].v = v;
	Edge[cnt].cost = cost;
	Edge[cnt].next = head[u];
	head[u] = cnt++;
}
double solve(int s,int g)
{
	double ans = INF;
	for(int S = 0;S < 1<<n;S++) fill(dp[S],dp[S]+50,INF);
	dp[(1<<n)-1][s] = 0;
	for(int S = (1<<n)-1;S >= 0;--S)
	{
		for(int u = 1;u <= m;u++)
		{
			for(int t = 0;t < n;t++)
			{
				for(int e = head[u];e!=-1;e = Edge[e].next)
				{
					int v = Edge[e].v;
					int cost = Edge[e].cost;
					if((S>>t)&1)
					{
						dp[S&~(1<<t)][v] = min(dp[S&~(1<<t)][v],dp[S][u] + (double)cost/(double)tickets[t]);
						if(v == g)
						{
							ans = min(ans,dp[S&~(1<<t)][v]);
						}
					}
				}
			}
		}
	}
	return ans;
}
int main()
{
	while(~scanf("%d%d%d%d%d",&n,&m,&p,&a,&b) && n+m+p+a+b)
	{
		memset(head,-1,sizeof(head));
		cnt = 0;
		for(int i = 0;i < n;i++) scanf("%d",&tickets[i]);
		for(int i = 0;i < p;i++) {
			 int u,v,c;
			 scanf("%d%d%d",&u,&v,&c);
			 add_edge(u,v,c);
			 add_edge(v,u,c);
		}
		double ans = solve(a,b);
		if(ans == INF) puts("Impossible");
		else printf("%.3f\n",ans);
		
	}
	return 0;
 } 

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator