HDU 4085 Steiner树模板称号
Dig The Wells
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 971 Accepted Submission(s): 416
will cost money. They do not want to cost too much money. Now they want you to find a cheapest plan.
Each test case will starts with three numbers n , m, and p in one line, n stands for the number of monks and m stands for the number of places that can been used, p stands for the number of roads between these places. The places the monks stay is signed from
1 to n then the other m places are signed as n + 1 to n + m. (1 <= n <= 5, 0 <= m <= 1000, 0 <=p <= 5000)
Then n + m numbers followed which stands for the value of digging a well in the ith place.
Then p lines followed. Each line will contains three numbers a, b, and c. means build a road between a and b will cost c.
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 Steiner树模板称号的更多相关文章
- HDU 4085 Steiner树
主题链接:pid=4085">http://acm.hdu.edu.cn/showproblem.php? pid=4085 由于这题专门花一晚上学习斯坦纳树.找到比較好的学习资料,链 ...
- HDU 1251 Trie树模板题
1.HDU 1251 统计难题 Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...
- HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...
- HDU - 1251 字典树模板题
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部 ...
- HDU(1166),线段树模板,单点更新,区间总和
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 第一次做线段树,帆哥的一句话,我记下来了,其实,线段树就是一种处理数据查询和更新的手段. 然后, ...
- hdu 2072(字典树模板,set,map均可做)
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2072 lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词 ...
- hdu 1754 线段树模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 #include <cstdio> #include <cmath> # ...
- hdu 1251 字典树模板题 ---多串 查找单词出现次数
这道题题目里没有给定数据范围 我开了2005 疯狂的WA 然后开了50000, A掉 我以为自己模板理解错 然后一天没吃饭,饿得胃疼还是想着把这题A掉再去吃,谁知竟然是这样的问题,,,呵呵~~~ ...
- hdu 2665 划分树模板题(可作为模板)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- springmvc + excel代
1.xml简介 <!-- excel use start --> <bean class="org.springframework.web.servlet.view.Bea ...
- Naive Bayes Classification
Maching Learning QQ群:2 请说明来自csdn 微信:soledede
- MySQL 存储过程和函数(转)
概述 一提到存储过程可能就会引出另一个话题就是存储过程的优缺点,这里也不做讨论,一般别人问我我就这样回答你觉得它好你就用它.因为mysql中存储过程和函数的语法非常接近所以就放在一起,主要区别就是函数 ...
- 为Linux用ISO制作U盘启动及基本原理
制作成功后的基本最简文件夹文件图 一.系统的基本引导流程: 首先系统要引导isolinux.bin可执行程序,此程序是移动介质上引导用的,isolinux.bin执行成功后会载入其配置文件syslin ...
- Fitnesse用系列三
动态决策表 动态决策表是新出,版本号到今年年初还没有了.我看了看文档和演示文稿样本,其效果是作为一种辅助通用决策表.它不是easy匹配的名称和发射.但假设只有一个或两个参数.不管名字怎么都找不到,这并 ...
- Cluster Table
对簇表来说,总是要先创建簇段(cluster segment).然后将表关联到cluster segment里.由此可知,簇表也是虚拟表,没有对应的segment,簇表对应的是cluster segm ...
- C语言程序代写(Linux下线程)
联系QQ:928900200 CSCI 3120 Operating Systems Summer 2014 Handout 3Assignment 2Date Due: June 5, 2014 b ...
- Timus 1777. Anindilyakwa 奇怪的问题计数
The language of Australian aborigines anindilyakwa has no numerals. No anindilyakwa can say: "I ...
- CentOS 安装memcached
一,安装libevent 安装位置 /usr/lib #tar -zxvf libevent-2.0.21-stable.tar.gz # cdlibevent-2.0.21 # ./configur ...
- UVA - 12130 Summits
Description Problem G - Summits Time limit: 8 seconds You recently started working for the largest m ...