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\ ...
随机推荐
- c++ rand && srand 函数
RAND: 结构:rand() 注:rand()不需要参数,它会根据种子返回一个从0到最大随机数的任意整数. 作用:生成一个随机数. 头文件:#include <cstdlib> ...
- C#上机作业及代码Question1
第一题创建控制台应用程序,利用下面的公式计算 q 的近似值,并运行出 k=10 时 q 的值. 本着开源的精神,献给各位,题目简单,随便写写,功能都实现了,不过现在先上传简单题,有一些难度的题目我先留 ...
- 26 c#类的组合
组合即将各个部分组合在一起.程序设计中就是用已有类的对象来产生新的类. 桌子由木板和钉子组合而成,台灯使用灯座,灯管,电线,接头等拼起来的.我们发现自己周围的很多东西都是由更小的其它东西拼凑构成的,就 ...
- WebForm vs MVC
What is ASP.NET? ASP.NET is a Microsoft’s Web application framework built on Common language runtime ...
- 连接服务器的mysql
在服务器配置好Mysql 数据库,在客户端连接,报错: 解决方法: 1.在MySQL 数据库中修改user表,将host 中的localhoust 改为 %: 2.配置访问数据库的全选 根据需要配置权 ...
- scroll的应用
jQuery(document).ready(function($){ $('#shang').click(function(){ $('html,body').animate({scrollTop: ...
- dede手机访问网站跳转到手机端模板
如何手机访问的时候跳转到自己的手机端模板,这时候需要一个js跳转代码:当手机访问的时候直接跳转到手机端 那手机端前提要有手机端的模板 <script> if(navigator.platf ...
- jdbc 实现分页
jdbc 实现分页,的实现 原理这个就不介绍了.. 总之是用jdbc 的游标移动 package com.sp.person.sql.util; import java.sql.Connection; ...
- Spring注解的步骤
Spring框架提供DI(属性注解)和IOC(类/Bean的注解)注解. 注解:标注.注入和解析.解释;标注和解释一部分代码的作用在框架中:就是配置文件的另外一种实现方式@Type.@Taget;减少 ...
- Java学习1_一些基础1——16.5.4
每个java程序中都必须有一个main方法,格式为: public class ClassName { public static void main(String[] args) { program ...