标签: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