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 ...
随机推荐
- 【buildroot-2011.11】You may have to install 'g++' on your build machine
buildroot - 2011.11 当进行交叉编译.例如像以下错误提及演示: "You may have to install 'g++' on your build machine&q ...
- Android在API推荐的方式来实现SQLite数据库的增长、删除、变化、检查操作
package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android. ...
- Xamarin.Android 入门实例(4)之实现对 SQLLite 进行添加/修改/删除/查询操作
1.Main.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...
- 生命游戏(两),有一种东西叫CCScrollView
订婚app要么game'肯定不会陌生:CCScrollView并且CCTableView. 假如我不知道是什么CCScrollView,再看看testcpp要么testlua样品棒. 先说说CCScr ...
- App设计相关网站
http://sketch.im/ 设计素材 principle 动效软件 http://principleformac.com/ 官网 http://principlecn.com/ 中文网
- PowerDesigner有几个需要设置
安装后PDM后.一些易于使用的设计人才需求. 一. 建立name与code做自己的主动关联,我们输入name当你不希望个别及连带code已经改变. 打开Tools->General Option ...
- HDOJ 5188 zhx and contest 贪婪+01背包
zhx and contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 开发一个Swing功能时的一点总结
对JTextField进行效验,有两个途径:(1)是使用javax.swing.InputVerifier在获取焦点时进行校验(2)在点击“确定”按钮的监听事件中对控件的值进行校验 鉴于涉及的业务比较 ...
- C++指针和引用简介
摘要 本文介绍C++指针和概念引用 这是一个指针 指针的类型 指针所指向的类型 指针表达式 指针与函数 什么是引用 指针引用差别 指针和引用的同样点和不同点 **什么是指针** 指针就是一个存放地址的 ...
- 从Java到C++——从union到VARIANT与CComVariant的深层剖析
我第一次用VARIANT和CComVariant的时候全然不明确它是怎么回事,为它什么数据类型都能够存放.什么数据都能够被能够初始化?里面究竟是怎么实现的?感觉又奇妙又迷惑!我们在上一节中讲了unio ...