UVA - 10911 Forming Quiz Teams

来源:互联网 发布:天士博电子白板软件 编辑:程序博客网 时间:2024/05/11 12:04

简单记忆化搜索,用二进制位表示组队情况

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>#define MAX 8#define INF 10000000using namespace std;int n,vis[1<<(2*MAX)],cases=1;char name[MAX*2][25];double x[MAX*2],y[MAX*2];double dp[1<<(2*MAX)];void init(){memset(vis,0,sizeof(vis));for(int i=0;i<(1<<(2*MAX));i++)dp[i]=INF;dp[(1<<(2*n))-1]=0.0;}double dist(int i,int j){return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));}void dfs(int team,int state){if(vis[state]==1)return ;vis[state]=1;if(team==n)return ;for(int i=0;i<n*2;i++){if(state&(1<<i))continue;for(int j=i+1;j<n*2;j++){if(state&(1<<j))continue;dfs(team+1,state+(1<<i)+(1<<j));dp[state]=min(dp[state],dp[state+(1<<i)+(1<<j)]+dist(i,j));}}}int main(){while(~scanf("%d",&n)&&n){for(int i=0;i<2*n;i++){scanf("%s %lf %lf",name[i],&x[i],&y[i]);}init();dfs(0,0);printf("Case %d: %.2lf\n",cases++,dp[0]);}return 0;}


0 0
原创粉丝点击