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\ ...
随机推荐
- mysql机制总结
Innodb和myisam最大的不同就是 innodb支持事物 采用了行锁 myisam 采用了表锁 默认就使用了表锁 表锁:速度快 并发小 发生锁冲突高 开销小 行锁:速度慢 并发高 发生锁冲突低 ...
- magento Grid 显示下拉菜单属性
在使用grid时自己新建了几个属性,然后其中有一个是下拉单,即deal_status protected function _prepareCollection() { $collection = M ...
- 03—AOP基本配置
- 第八届蓝桥杯省赛C/C++ A组第4题 方格分割
参考了http://blog.csdn.net/y1196645376/article/details/69718192,这个大哥的思路很巧妙. 思路: dfs. 实现: #include <i ...
- vue 父子组件双向绑定
vue组件有2大特性: 1.全局组件和局部组件 2.父子组件的数据传递 接下来直接用demo直接看如何传值(静态传值) father.vue <template> <div> ...
- Android Camera 3D效果
一.概念 在Android中要想实现3D效果,第一个想到的应该就是OpenGL ES,因为在很多基础教材中几乎都提到了它.但是其使用起来还是稍微麻烦一些,而且它也主要用在游戏方面,那在应用方面有没有更 ...
- 联想 S5 Pro GT(L78091)免解锁BL 免rec 保数据 ROOT Magisk Xposed 救砖 ZUI5.0.047
>>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...
- 梦想CAD控件安卓控件事件
MxDrawActivity.commandEvent 命令调用事件. 参数 说明 int iCommand 命令ID,这个ID用户自已来取的,只要多个命令ID不重复就可以 代码实现如下: publi ...
- 08Microsoft SQL Server 数据查询
Microsoft SQL Server 数据查询 单表查询所有列 --查询所有行所有列 select all * from table; --查询不重复行的所有列 select distinct * ...
- xmpp获取好友信息和添加删除好友(4)
原始地址: XMPPFrameWork IOS 开发(五)获取好友信息和添加删除好友 好友列表和好友名片 [_xmppRoster fetchRoster];//获取好友列表 //获取到一个好友节点 ...