斯坦纳树,$dp$。

先求出每个状态下连通的最小花费,因为可以是森林,所以$dp$一下。

#include<bits/stdc++.h>
using namespace std; int n;
const int INF = 0x7FFFFFFF;
struct X
{
int p,s,q;
}e[];
int id[];
vector<int>g[];
int val[][],d[][],dp[];
int f[*],k;
queue<int>Q; int num[],cost[]; void spfa()
{
while(!Q.empty())
{
int h = Q.front(); Q.pop(); f[h]=;
int x=h/,y=h%;
for(int i=;i<g[x].size();i++)
{
int to = g[x][i]; if(to<k)
{
if(((<<to)&y)==)
{
if(d[x][y]+val[x][to]<d[to][y|(<<to)])
d[to][y|(<<to)]=d[x][y]+val[x][to];
}
} else
{
if(d[x][y]+val[x][to]<d[to][y])
{
d[to][y] = d[x][y]+val[x][to];
if(f[to*+y]==)
{
f[to*+y]=;
Q.push(to*+y);
}
}
}
}
}
} bool cmp(X a,X b)
{
if(a.p!=b.p) return a.p>b.p;
return a.s>b.s;
} void work(int x)
{
int A=,B=;
for(int i=;i<k;i++)
{
if(((<<i)&x)==) continue;
A=A+e[i].p; B=B+e[i].s;
}
num[x] = min(A,B);
cost[x] = dp[x];
} int main()
{
while(~scanf("%d",&n))
{
for(int i=;i<n;i++)
{
scanf("%d%d",&e[i].p,&e[i].s);
e[i].p = min(,e[i].p);
e[i].q = i;
}
sort(e,e+n,cmp);
for(int i=;i<n;i++) id[e[i].q]=i; for(int i=;i<n;i++)
for(int j=;j<n;j++) val[i][j]=INF;
memset(f,,sizeof f);
for(int i=;i<n;i++) g[i].clear(); int m; scanf("%d",&m);
for(int i=;i<=m;i++)
{
int a,b,c; scanf("%d%d%d",&a,&b,&c);
a--; b--; a=id[a]; b=id[b];
val[a][b]=min(val[a][b],c);
val[b][a]=val[a][b];
g[a].push_back(b);
g[b].push_back(a);
} k=; for(int i=;i<n;i++) if(e[i].p||e[i].s) k++; int st = <<k;
for(int j=;j<st;j++)
for(int i=;i<n;i++) d[i][j]=INF; for(int i=;i<n;i++)
{
if(i<k) d[i][<<i]=;
else d[i][]=;
} for(int j=;j<st;j++)
{
for(int i=;i<n;i++)
{
if(i<k)
{
if(((<<i)&j)==) continue;
for (int x = j; x; x = (x-)&j)
{
int A=x ,B=j-A;
if(d[i][A|(<<i)]!=INF&&d[i][B|(<<i)]!=INF)
d[i][j] = min(d[i][j], d[i][A|(<<i)]+d[i][B|(<<i)]);
}
}
else
{
for (int x = j; x; x = (x-)&j)
{
int A=x ,B=j-A;
if(d[i][A]!=INF&&d[i][B]!=INF)
d[i][j] = min(d[i][j], d[i][A]+d[i][B]);
}
}
if(d[i][j]!=INF) Q.push(i*+j);
}
spfa();
} for(int j=;j<st;j++)
{
dp[j]=INF;
for(int i=;i<n;i++) dp[j]=min(dp[j],d[i][j]);
} memset(num,,sizeof num);
memset(cost,,sizeof cost); for(int i=;i<st;i++)
{
if(dp[i]!=INF) work(i);
for (int x = i; x; x = (x-)&i)
{
int A=x, B=i-x;
if(num[A]+num[B]>num[i])
{
num[i] = num[A]+num[B];
cost[i] = cost[A]+cost[B];
}
else if(num[A]+num[B]==num[i])
{
if(cost[A]+cost[B]<cost[i])
cost[i] = cost[A]+cost[B];
}
}
} int ans1=,ans2=;
for(int i=;i<st;i++) ans1=max(ans1,num[i]);
for(int i=;i<st;i++)
{
if(num[i]!=ans1) continue;
ans2=min(ans2,cost[i]);
}
printf("%d %d\n",ans1,ans2); }
return ;
}

ZOJ 3613 Wormhole Transport的更多相关文章

  1. ZOJ 1456 Minimum Transport Cost(Floyd算法求解最短路径并输出最小字典序路径)

    题目链接: https://vjudge.net/problem/ZOJ-1456 These are N cities in Spring country. Between each pair of ...

  2. ZOJ 1456 Minimum Transport Cost(floyd+后继路径记录)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1456 题意:求最短路并且输出字典序最小的答案. 思路:如果用dijkstr ...

  3. [GodLove]Wine93 Tarining Round #2

    比赛链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=44704#overview 题目来源: ZOJ Monthly, June 2 ...

  4. Minimal Steiner Tree ACM

    上图论课的时候无意之间看到了这个,然后花了几天的时间学习了下,接下来做一个总结. 一般斯坦纳树问题是指(来自百度百科): 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在 ...

  5. ZOJ 1655 FZU 1125 Transport Goods

    迪杰斯特拉最短路径. 1.every city must wait till all the goods arrive, and then transport the arriving goods t ...

  6. ZOJ - 1655 Transport Goods(单源最长路+迪杰斯特拉算法)

    题目: 有N-1个城市给首都(第N个城市)支援物资,有M条路,走每条路要耗费一定百分比(相对于这条路的起点的物资)的物资.问给定N-1个城市将要提供的物资,和每条路的消耗百分比.求能送到首都的最多的物 ...

  7. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  8. hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)

    Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...

  9. POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Network / FZU 1161 (网络流,最大流)

    POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Networ ...

随机推荐

  1. 前端PHP入门-029-文件操作-掌握级别

    人生只有三天,活在昨天的人迷惑:活在明天的人等待:活在今天的人最踏实.你永远无法预测意外和明天哪个来得更早,所以,我们能做的,就是尽最大的努力过好今天.请记住:今天永远是昨天死去的人所期待的明天. f ...

  2. js获取本周、上周的开始结束时间

    这两天在做一个报表体统,其中涉及到了一个根据本周,上周,本月,上月的时间来进行查询的问题,在这个我就教一下大家怎么实现,大家如果有更好的实现方法的,我也希望大家能说出来,我们交流交流. 首先呢,我写了 ...

  3. Distributed Systems 分布式系统

    先来扯淡,几天是14年12月31日了,茫茫然,2014就剩最后一天了.这两天国大都放假,我给自己安排了四篇博客欠账,这就是其中的第一篇,简单介绍一些分布式系统的一些概念和设计思想吧.后面三篇分别是Ne ...

  4. Java实现链式存储的二叉树

    二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...

  5. .Net各版本新特性

    序言 C# 1.0 (2002) public interface IDateProvider { DateTime GetDate(); } 隐式接口实现 public class DefaultD ...

  6. 获取Spring的ApplicationContext的几种方式

    Application Context定义 简单来说就是Spring中的高级容器,可以获取容器中的各种bean组件,注册监听事件,加载资源文件等功能. 具体定义可以参考官网:https://sprin ...

  7. 关于Java泛型深入理解小总结

    1.何为泛型 首先泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,原理类似如下代码 int pattern; //声 ...

  8. 手机网页的头部meta的相关配置~~

    今天使用sublime写手机端网页的时候,发现木有meta的自动生成手机网页的快捷键·~ 然后就去网上巴拉,准备存储一份~~哈哈 一.天猫 <title>天猫触屏版</title&g ...

  9. 22、WebDriver

    什么是WebDriver?1.Webdriver(Selenium2)是一种用于Web应用程序的自动测试工具:2.它提供了一套友好的API:3.Webdriver完全就是一套类库,不依赖任何测试框架, ...

  10. Xcode 9安装

    Xcode 9 Xcode 9 Compatibility Xcode 9 requires a Mac running macOS 10.13.2 or later. Xcode 9 include ...