CF576D. Flights for Regular Customers
n<=150个点,m<=150条路,每条路Ai,Bi,Di表示Ai到Bi有一条有向边,使用他前至少要走Di条路,问1到n最少走几条路。
又是n^4过150的题。。。。
不同于传统的最短路,这次的最短路包括了m个图,并且状态和走的路径数有关。所以要一个状态Can(i,j)表示能否到达点i走j步。
由于有m个图,我们就一个一个图来看。把边从小到大加入图,每加入某个值的一组边即可构成一个新图。在进入一个新图之前,我需要知道:在上个图的最后一步,从1走能走到哪些点,已这些点为起点进行下一步的探索。新来一个图之后,先尝试在这个图上走 不进入下个图的边数,能不能走到n点,如果能输出答案,不能就记这个图最后能从一到达哪些点然后进行下一步扩展。而尝试找能否走到n点,不可能从C(i,Dj)一路推到C(i,Dj+1)这里的D排序好了,所以需要一个倍增floyd。
然而这样的话是m*n*n*n*logMax,咋整?floyd用bitset优化!m*n*n*n*logMax/32大概就是n^4啦
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<bitset>
//#include<math.h>
//#include<iostream>
using namespace std; int n,m;
#define maxn 161
struct Mat
{
bitset<maxn> a[maxn];
void clear() {for (int i=;i<=n;i++) a[i].reset();}
Mat operator * (const Mat &b)
{
Mat ans;
for (int j=;j<=n;j++)
for (int i=;i<=n;i++)
if (a[i][j]) ans.a[i]|=b.a[j];
return ans;
}
Mat operator ^ (const Mat &b)
{
Mat ans;
for (int j=;j<=n;j++)
for (int i=;i<=n;i++)
if (a[i][j]) ans.a[i]|=b.a[j];
for (int i=;i<=n;i++) ans.a[i]|=a[i];
return ans;
}
}mp,f[],base; struct Point
{
int a,b,d;
bool operator < (const Point &b) const {return d<b.d;}
}p[maxn];
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++) scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].d);
sort(p+,p++m);
if (p[].d) {puts("Impossible");return ;}
p[m+].d=0x3f3f3f3f;
base.a[][]=;
for (int i=;i<=m+;i++)
{
while (i<=m+ && p[i].d==p[i-].d) {mp.a[p[i-].a][p[i-].b]=; i++;}
int j,num=p[i].d-p[i-].d;
for (j=;j>=;j--) if ((<<j)<=num) break;
f[]=mp;
for (int k=;k<=j;k++) f[k]=f[k-]^f[k-];
Mat now; now=base; int cnt=;
for (int k=j;k>=;k--) if (cnt+(<<k)<=num)
{
Mat tmp;tmp=now^f[k];
bool flag=;
for (int l=;l<=n;l++) flag|=tmp.a[l][n];
if (!flag) cnt+=(<<k),now=tmp;
}
if (cnt!=num) {printf("%d\n",p[i-].d+cnt+);return ;}
else
{
f[]=mp;
for (int k=;k<=j;k++) f[k]=f[k-]*f[k-];
cnt=;
for (int k=j;k>=;k--) if (cnt+(<<k)<=num) base=base*f[k],cnt+=(<<k);
Mat tmp; tmp=base;
base.clear();
for (int k=;k<=n;k++)
for (int l=;l<=n;l++)
if (tmp.a[k][l]) base.a[l][l]=;
}
}
puts("Impossible");
return ;
}
CF576D. Flights for Regular Customers的更多相关文章
- CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化
%%%cxhscst2's blog Codeforces 576D Flights for Regular Customers(矩阵加速DP) 代码非常优美 + 简洁,学习到了 Code: #inc ...
- 「CF576D」 Flights for Regular Customers
「CF576D」 Flights for Regular Customers 对不起我又想网络流去了 你看这长得多像啊,走过至少多少条边就是流量下界,然后没上界 但是这个题求的最少走多少条边啊...完 ...
- 【CodeForces】576 D. Flights for Regular Customers
[题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...
- Codeforces 576D Flights for Regular Customers(矩阵加速DP)
题目链接 Flights for Regular Customers 首先按照$d$的大小升序排序 然后分成$m$个时刻,每条路径一次处理过来. $can[i][j]$表示当前时刻$i$能否走到$j ...
- 题解 CF576D 【Flights for Regular Customers】
对每条边来说,可以走这条边的限制解除是按\(d\)的顺序,所以先对每条边按\(d\)排序. 然后考虑每两条边之间的处理,用一个矩阵表示当前走\(d\)步是否可以从一个点到另一个点,称其为状态矩阵,用另 ...
- (中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。
In the country there are exactly n cities numbered with positive integers from 1 to n. In each city ...
- Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP
题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...
- Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)
这破题调了我一天...错了一大堆细节T T 首先显然可以将边权先排序,然后逐个加进图中. 加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑. 倍增的时候要预处理出h[i]表示转移矩阵的2^0~ ...
- Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)
题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...
随机推荐
- CSS3 核心知识面试题
一种常见利用伪类清除浮动的代码 .clearfix:after { content:"."; //这里利用到了content属性 display:block; height:; v ...
- 设计基于HTML5的APP登录功能及安全调用接口的方式
转自:http://blog.csdn.net/linlzk/article/details/45536065 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而 ...
- 北工大2017校赛 1101:要打车的FanZzz
题目链接: http://bjutacm.openjudge.cn/lianxi/1101/ 思路: 二分 + 二分图最大匹配. 开始的时候我想直接用最小费用流模型,后来发现这样是错误的.因为这道题实 ...
- jQuery中$this和$(this)的区别
要写一个点击弹窗任意地方,关闭弹窗.点击事件写标签在元素上 onclick = closepop(this),这时候很容易搞不清楚怎么去获取当前元素 function closepop(e){ va ...
- post登录资料备份
# coding=utf-8 import urllib import hashlib import http.client import http.cookiejar import http.coo ...
- Linux学习日记之crontab使用notify-send实现每小时通知提醒
crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行 通过crontab -e 可以打开编辑文件添加新的命令 notif ...
- acm练习-day1_1
“麻雀”lengdan用随机数生成了后台数据,但是笨笨的他被妹纸的问题给难住了... 已知lengdan生成了N(1=<N<=10005)个随机整数,妹子对这些数可能有以下几种操作或询问: ...
- OC语言Block
OC语言Block 一.Block (一)简介 Block是什么?苹果推荐的比较特殊的数据类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. Block和 ...
- 可滚动的ResultSet类型 实现分页
可滚动的ResultSet类型. 这个类型支持前后滚动取得纪录next().previous(),回到第一行first(),同时还支持要取的 ResultSet中的第几行 absolute(int n ...
- POJ_1062_(dijkstra)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 48126 Accepted: 14343 Descripti ...