标签:des style java color strong os
3 1 3 1 2 3 4 1 4 2 2 4 2 3 4 4 4 1 4 5 5 5 5 1 1 5 1 2 5 1 3 5 1 4 5 1
6 5
题意:有n个和尚,每一个和尚一个庙,有m个村庄,p条路,每条路有费用,每一个地方打井也需要费用,求最少花多少钱可以使得所有和尚喝上水。
斯坦纳树比较裸的问题。
代码:
/* ***********************************************
Author :rabbit
Created Time :2014/7/17 0:59:57
File Name :13.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 100000000
#define eps 1e-8
#define pi acosi
typedef long long ll;
int head[1100],tol;
struct Edge{
	int next,to,val;
}edge[1001000];
void addedge(int u,int v,int w){
	edge[tol].to=v;
	edge[tol].next=head[u];
	edge[tol].val=w;
	head[u]=tol++;
}
int weight[1100],d[1100][1<<5],dp[1100],in[1010][1<<5];
int main()
{
     //freopen("data.in","r",stdin);
     //freopen("data.out","w",stdout);
     int n,m,p;
	 while(~scanf("%d%d%d",&n,&m,&p)){
		 memset(head,-1,sizeof(head));tol=0;
		 for(int i=0;i<n+m;i++)
			 scanf("%d",&weight[i]);
		 while(p--){
			 int u,v,w;
			 scanf("%d%d%d",&u,&v,&w);
			 u--;v--;
			 addedge(u,v,w);
			 addedge(v,u,w);
		 }
		 for(int i=0;i<n+m;i++)
			 for(int j=0;j<(1<<n);j++)
				 d[i][j]=INF;
		 for(int i=0;i<(1<<n);i++)dp[i]=INF;
		 memset(in,0,sizeof(in));
		 for(int i=0;i<n;i++)
			 d[i][1<<i]=weight[i];
		 for(int i=1;i<(1<<n);i++){
			 queue<int> Q;
			 for(int j=0;j<n+m;j++){
				 for(int k=i&(i-1);k;k=(k-1)&i)
					 d[j][i]=min(d[j][i],d[j][i-k]+d[j][k]-weight[j]);
				 if(d[j][i]<INF)Q.push(100000*j+i),in[j][i]=1;
			 }
			 while(!Q.empty()){
				 int v=Q.front()/100000,t=Q.front()%100000;
				 Q.pop();
				 in[v][t]=0;
				 for(int e=head[v];e!=-1;e=edge[e].next){
					 int s=edge[e].to;
					 if(d[s][t]>d[v][t]+edge[e].val+weight[s]-weight[v]){
						 d[s][t]=d[v][t]+edge[e].val+weight[s]-weight[v];
						 if(!in[s][t]){
							 in[s][t]=1;
							 Q.push(100000*s+t);
						 }
					 }
				 }
			 }
		 }
		 for(int i=1;i<(1<<n);i++)
			 for(int j=0;j<n+m;j++)
				 dp[i]=min(dp[i],d[j][i]);
		 for(int i=1;i<(1<<n);i++){
			 for(int j=i&(i-1);j;j=i&(j-1))
				 dp[i]=min(dp[i],dp[j]+dp[i-j]);
		 }
		 cout<<dp[(1<<n)-1]<<endl;
	 }
     return 0;
}
HDU 4085 斯坦纳树模板题,布布扣,bubuko.com
标签:des style java color strong os
原文地址:http://blog.csdn.net/xianxingwuguan1/article/details/37892541