HDU 4085 Steiner树
主题链接: pid=4085">http://acm.hdu.edu.cn/showproblem.php? pid=4085
由于这题专门花一晚上学习斯坦纳树。找到比較好的学习资料,链接在这里:http://endlesscount.blog.163.com/blog/static/821197872012525113427573/
花了非常长时间照着别人写了一份自己风格的代码,慢慢理解:
/* ***********************************************
Author :rabbit
Created Time :2014/7/16 20:45:31
File Name :1.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 acos(-1.0)
typedef long long ll;
const int maxn=60;
struct Edge{
int next,to,val;
}edge[2100];
int head[maxn],tol,n,m,K;
int s[maxn],in[maxn][1<<10],d[maxn][1<<10],dp[1<<10];
void addedge(int u,int v,int c){
edge[tol].to=v;
edge[tol].next=head[u];
edge[tol].val=c;
head[u]=tol++;
}
bool check(int x){
int r=0;
for(int i=0;x;i++,x>>=1)
r+=(x&1)*(i<K? 1:-1);
return r==0;
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int T;
cin>>T;
while(T--){
memset(head,-1,sizeof(head));tol=0;
memset(in,0,sizeof(in));
memset(s,0,sizeof(s));
scanf("%d%d%d",&n,&m,&K);
int nn=1<<(2*K);
for(int i=1;i<=n;i++)
for(int j=0;j<nn;j++)
d[i][j]=INF;
while(m--){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
for(int i=1;i<=K;i++){
s[i]=1<<(i-1),d[i][s[i]]=0;
s[n-i+1]=1<<(K+i-1),d[n-i+1][s[n-i+1]]=0;
}
for(int y=0;y<nn;y++){
queue<int> Q;
for(int x=1;x<=n;x++){
for(int i=(y-1)&y;i;i=(i-1)&y)
d[x][y]=min(d[x][y],d[x][i|s[x]]+d[x][(y-i)|s[x]]);
if(d[x][y]<INF)Q.push(x*10000+y),in[x][y]=1;
}
while(!Q.empty()){
int x=Q.front()/10000,y=Q.front()%10000;
in[x][y]=0;
Q.pop();
for(int i=head[x];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(d[v][y|s[v]]>d[x][y]+edge[i].val){
d[v][y|s[v]]=d[x][y]+edge[i].val;
if(y==(y|s[v])&&!in[v][y]){
in[v][y]=1;
Q.push(10000*v+y);
}
}
}
}
}
for(int j=0;j<nn;j++){
dp[j]=INF;
for(int i=1;i<=n;i++)
dp[j]=min(dp[j],d[i][j]);
}
for(int i=1;i<nn;i++)
if(check(i))
for(int j=i&(i-1);j;j=(j-1)&i)
if(check(j))
dp[i]=min(dp[i],dp[j]+dp[i-j]);
if(dp[nn-1]>=INF)puts("No solution");
else printf("%d\n",dp[nn-1]);
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
HDU 4085 Steiner树的更多相关文章
- HDU 4085 Steiner树模板称号
Dig The Wells Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 5458 Stability(树链剖分+并查集)
Stability Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Total ...
- hdu 5398 动态树LCT
GCD Tree Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- hdu 5002 (动态树lct)
Tree Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- hdu 5314 动态树
Happy King Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tot ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
随机推荐
- [Windwos Phone 8]多个按钮的共用事件
原文:[Windwos Phone 8]多个按钮的共用事件 前言 ------------------------------------------------------------------- ...
- JS window.open()财产
一. Window 对象 Window 对象是 JavaScript 顶级对象层次. Window 对象表示一个浏览器窗口或帧. Window 在对象 <body> 或 <frame ...
- [原创] 使用rpi + crontab + git 定时向bitbucket 推送 照片
#前提条件,你得有一个bitbucket的帐户 1.定时启动脚本代码 使用的是crontab Cronfile 内容如下: 此文件的意思是,每隔10分钟,就运行一次 /home/pi/Rpi_uplo ...
- twrp gui/actions.cpp 中的功能实现 tw_action ,tw_action_param ,第二章
继续分析 twrp ui.xml中的相关内容,以<page name="reboot">为讲解内容 <object type="button" ...
- 认识Backbone (一)
Backbone.js为复杂WEB应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富API: 视 ...
- Android - 支持不同的设备 - 支持不同的语言
把app的字符串放到另外一个文件中是一个好习惯.Android用android工程中的资源文件夹让这件事变的很简单. 如果使用Android SDK Tools创建工程,这个工具会在工程的根目录下创建 ...
- linux input如何固定设备event handler
于qt开发时间.遇到的问题,usb输入设备(鼠标器,usb 电容屏)在动力分配后自己主动input节点,实例usb鼠标停留电后,分配给自己的主动性/dev/input/event0 mouse0.第一 ...
- [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪
朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...
- [Django1.6]south于django1.6使用
south在django1.6中的使用 django1.7中已经支持数据合并了,所以仅仅能在django1.4 1.5 1.6的版本号中使用south. south的主要作用就是做数据的合并,当我们在 ...
- C++学习笔记1--基础知识
#include <iomanip> setpresition(int n); 设置输出精度浮点数是n. [goto声明] goto也被称为无条件分支语句购买勇于改变运行顺序的声明.got ...