ZOJ 3613 Wormhole Transport
斯坦纳树,$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的更多相关文章
- ZOJ 1456 Minimum Transport Cost(Floyd算法求解最短路径并输出最小字典序路径)
题目链接: https://vjudge.net/problem/ZOJ-1456 These are N cities in Spring country. Between each pair of ...
- ZOJ 1456 Minimum Transport Cost(floyd+后继路径记录)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1456 题意:求最短路并且输出字典序最小的答案. 思路:如果用dijkstr ...
- [GodLove]Wine93 Tarining Round #2
比赛链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=44704#overview 题目来源: ZOJ Monthly, June 2 ...
- Minimal Steiner Tree ACM
上图论课的时候无意之间看到了这个,然后花了几天的时间学习了下,接下来做一个总结. 一般斯坦纳树问题是指(来自百度百科): 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在 ...
- ZOJ 1655 FZU 1125 Transport Goods
迪杰斯特拉最短路径. 1.every city must wait till all the goods arrive, and then transport the arriving goods t ...
- ZOJ - 1655 Transport Goods(单源最长路+迪杰斯特拉算法)
题目: 有N-1个城市给首都(第N个城市)支援物资,有M条路,走每条路要耗费一定百分比(相对于这条路的起点的物资)的物资.问给定N-1个城市将要提供的物资,和每条路的消耗百分比.求能送到首都的最多的物 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 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 ...
- 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 ...
随机推荐
- package.json文档
之前在博客中写过一篇关于 " node.js的安装配置 " 的文章,里面有提到利用 gulp watch 来监听文档的变化.其中需要 package.json 文件才能实现效果,所 ...
- 2017ACM暑期多校联合训练 - Team 7 1010 HDU 6129 Just do it (找规律)
题目链接 Problem Description There is a nonnegative integer sequence a1...n of length n. HazelFan wants ...
- python初步学习-python模块之 logging
logging 许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在python中,我们不需要第三方的日志组件,python为我们提供了简单易用.且 ...
- HBase笔记之远程Shell界面命令行无法删除字符的解决方案
方法一: 设置终端退格键为ASCII 127 在XShell的界面中,设置 文件 --> 属性 --> 终端 --> 键盘 --> BACKSPACE键序列,改为ASCII 1 ...
- 从ISE14.7使用Micoblaze点亮led灯
1. ISE => new program => new source => embedded processor 2. XPS 2.1 create new xps program ...
- docker ubuntu容器更换阿里源(转)
问题:使用docker 利用下载的ubuntu镜像启动容器时,使用的源下载更新软件的速度较慢. 解决这个问题的方法是跟新ubuntu容器的源 示例:以ubuntu为基础镜像 启动一个名称为 test0 ...
- 转: oracle中schema指的是什么?
看来有的人还是对schema的真正含义不太理解,现在我再次整理了一下,希望对大家有所帮助. 我们先来看一下他们的定义:A schema is a collection of database obje ...
- 健身VS不健身,完全是两种不同的人生!
这两天一组同龄人合照 刷爆了国内健身圈, 图左是一位67岁的老人, 图右是67岁的健美运动员杨新民老师 相同年龄, 但从外观上有着强烈的距离感! 让多人不禁感叹,健身和不健身, 简直就是两种状态,两种 ...
- rabbitmq集群搭建方法简介(测试机linux centos)【转】
本文将介绍四台机器搭建rabbitmq集群: rabbitmq IP和主机名(每台机器已安装RabbitMQ 3.5.6, Erlang 18.1) 192.168.87.73 localhost73 ...
- 禁用quartz自动检查更新
禁用quartz自动检查更新的3种方法 1, <bean id="startQuertz" lazy-init="false" autowire=&quo ...