码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 576D Flights for Regular Customers(矩阵加速DP)

时间:2017-10-05 10:55:58      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:com   col   contest   get   name   end   its   bitset   http   

题目链接  Flights for Regular Customers

首先按照d的大小升序排序

然后分成m个时刻,每条路径一次处理过来。

can[i][j]表示当前时刻i能否走到j

can通过上一条路径后的can和当前的可行路径矩阵的d次幂得到。

这由floyd求解即可。考虑到d很大,用矩阵快速幂加速。

TLE on test 10

矩阵乘法的时候用bitset优化。

更新答案的时候,我们枚举每个点。

若第1个点可以走到第i个点,则更新答案。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)

const int N   = 160;
const int inf = 0x3f3f3f3f;

int n, m, ans = inf;
int dis[N][N], f[N][N];
int cnt;
bitset <N> can[N], now[N], tmp[N], base[N];

struct node{
	int x, y, d;
	void scan(){ scanf("%d%d%d", &x, &y, &d); }
	friend bool operator < (const node &a, const node &b){
		return a.d < b.d;
	}
} e[N];

void Mul(bitset<N> *a, bitset<N> *b){
	bitset<N> ret[N];
	rep(i, 1, n) rep(j, 1, n) if(a[i][j]) ret[i] |= b[j];
	rep(i, 1, n) a[i] = ret[i];
}

void Pow(bitset <N> *a, int b){
	bitset <N> ret[N];
	rep(i, 1, n) ret[i][i] = 1;
	for (; b; b >>= 1){
		if (b & 1) Mul(ret, a);
		Mul(a, a);
	}
	rep(i, 1, n) a[i] = ret[i];
}

int main(){

	scanf("%d%d", &n, &m);
	rep(i, 1, m) e[i].scan();

	sort(e + 1, e + m + 1);

	rep(i, 1, n) rep(j, 1, n) dis[i][j] = inf;
	rep(i, 1, n) dis[i][i] = 0;

	cnt = 0;
	ans = inf;
	rep(i, 1, n) can[i][i] = 1;

	rep(i, 1, m){
		int x = e[i].x, y = e[i].y, d = e[i].d;
		rep(j, 1, n) tmp[j] = base[j];
		Pow(tmp, d - cnt);
		Mul(can, tmp);
		rep(j, 1, n) rep(k, 1, n) dis[j][k] = min(dis[j][k], dis[j][x] + 1 + dis[y][k]);
		rep(j, 1, n - 1) if (can[1][j]) ans = min(ans, d + dis[j][n]);
		cnt = d;
		base[x][y] = 1;
	}

	if (ans < 0x3f3f3f3f) printf("%d\n", ans);
	else puts("Impossible");
	return 0;
}

 

Codeforces 576D Flights for Regular Customers(矩阵加速DP)

标签:com   col   contest   get   name   end   its   bitset   http   

原文地址:http://www.cnblogs.com/cxhscst2/p/7628125.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!