【BZOJ4774】修路

24人阅读 评论(0) 收藏 举报
分类:

【题目链接】

【思路要点】

  • 补档博客,无题解。

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXQ	1000005
#define MAXN	10005
#define CURR	256
#define INF	1e9
struct edge {int dest, len; };
vector <edge> a[MAXN];
int n, m, d, num[MAXN];
int ans[MAXN][CURR], opt[CURR];
bool inq[MAXN][CURR];
int func(int x) {
	return x + (x << d);
}
int main() {
	ios::sync_with_stdio(false);
	cin >> n >> m >> d;
	for (int i = 1; i <= m; i++) {
		int x, y, z;
		cin >> x >> y >> z;
		a[x].push_back((edge) {y, z});
		a[y].push_back((edge) {x, z});
	}
	int tot = 0;
	for (int i = 1; i <= d; i++)
		num[i] = ++tot;
	for (int i = 1; i <= d; i++)
		num[n - i + 1] = ++tot;
	for (int i = 1; i <= n; i++)
	for (int j = 1; j < 1 << 2 * d; j++)
		if (num[i] && j == 1 << num[i] - 1) ans[i][j] = 0;
		else ans[i][j] = INF;
	for (int curr = 1; curr < 1 << 2 * d; curr++) {
		static int qx[MAXQ], qy[MAXQ];
		int l = 0, r = -1;
		for (int i = 1; i <= n; i++) {
			for (int j = (curr - 1) & curr; j; j = (j - 1) & curr)
				ans[i][curr] = min(ans[i][curr], ans[i][j] + ans[i][curr ^ j]);
			if (ans[i][curr] < INF) {
				inq[i][curr] = true;
				qx[++r] = i;
				qy[r] = curr;
			}
		}
		while (l <= r) {
			int tx = qx[l], ty = qy[l++];
			inq[tx][ty] = false;
			for (unsigned i = 0; i < a[tx].size(); i++)
				if (ans[tx][ty] + a[tx][i].len < ans[a[tx][i].dest][ty]) {
					ans[a[tx][i].dest][ty] = ans[tx][ty] + a[tx][i].len;
					if (!inq[a[tx][i].dest][ty]) {
						qx[++r] = a[tx][i].dest;
						qy[r] = ty;
						inq[qx[r]][qy[r]] = true;
					}
				}
		}
	}
	for (int j = 0; j < 1 << d; j++) {
		int tmp = func(j), tans = INF;
		for (int i = 1; i <= n; i++)
			tans = min(tans, ans[i][tmp]);
		opt[j] = tans;
	}
	for (int i = 1; i < 1 << d; i++)
	for (int j = (i - 1) & i; j; j = (j - 1) & i)
		opt[i] = min(opt[i], opt[j] + opt[i ^ j]);
	if (opt[(1 << d) - 1] == INF) cout << -1 << endl;
	else cout << opt[(1 << d) - 1] << endl;
	return 0;
}

查看评论

[BZOJ4774]修路

斯坦纳树入门题
  • QAQ__QAQ
  • QAQ__QAQ
  • 2017-03-22 10:38:01
  • 484

BZOJ 4774 修路

斯坦纳树DP斯坦纳树经典DP方程:f[s][i]f[s][i] 表示当前需连通点的连通情况至少为ss,且路径上一定经过点ii的代价。为什么说是至少为ss,因为可能方案里的路径经过了别的点,然而在当前状...
  • ziqian2000
  • ziqian2000
  • 2017-04-27 23:28:00
  • 255

[BZOJ4774]修路(斯坦纳树+dp)

题目描述传送门题目大意:给出一个n个点m条边的无向图,要求选一些边,使得对于1≤i≤d1\le i\le d的点i和n-i+1的点连通,并且边权和最小。题解f(i,s)表示和点i连通的点状态为s的最小...
  • Clove_unique
  • Clove_unique
  • 2017-04-18 07:35:44
  • 768

BZOJ4774 修路

同BZOJ4006 #include #include #include #include #include #include #include #include #include #include...
  • neither_nor
  • neither_nor
  • 2017-03-17 16:53:08
  • 793

bzoj 4774: 修路 (斯坦纳树)

题目描述传送门题解与HDU4085基本上是一样的代码#include #include #include #include #include #define N 20003 #define INF 1...
  • clover_hxy
  • clover_hxy
  • 2017-04-16 15:55:33
  • 173

bzoj4774 修路(斯坦纳树)

题目链接 分析: 第一次看到这道题,觉得就是一个MST 但是我明明找到的斯坦纳树的练习啊。。。 实际上不是很明白MST和斯坦纳树的区别,好像都是最小网络 不过斯坦纳树可以在给出点外另找点,并...
  • wu_tongtong
  • wu_tongtong
  • 2018-03-21 20:42:34
  • 47

修路问题

题目: 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有...
  • cq340321
  • cq340321
  • 2017-03-29 10:59:31
  • 437

Hust oj 1039 修路(二分)

修路 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 406(204 users)...
  • Sara_YF
  • Sara_YF
  • 2016-05-23 13:53:19
  • 825

要想富先修路 (并查集)

Description习大大说过“要想富,先修路”,我们国家的公路建设正是在践行这句名言。假设某镇一共有N个村庄,政府决定在这些村庄之间建设M条公路。第i条公路连接着两个村庄,ui和vi,并会在第ti...
  • q3818908
  • q3818908
  • 2017-05-19 20:38:56
  • 490

逢山修路问题(数学建模)

  • 2009年08月25日 11:27
  • 477KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 9880
    积分: 2743
    排名: 1万+
    文章分类
    文章存档