%%%cxhscst2's blog

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

代码非常优美 + 简洁,学习到了

Code:

#include <bits/stdc++.h>
#define N 160
#define inf 0x3f3f3f3f
#define maxn 1000000
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
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];
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j) if(a[i][j]) ret[i]|=b[j];
for(int i=1;i<=n;++i) a[i]=ret[i];
}
void Pow(bitset<N>*a,int b)
{
bitset<N>ret[N];
for(int i=1;i<=n;++i) ret[i][i]=1;
for(;b;b>>=1)
{
if(b&1) Mul(ret, a);
Mul(a,a);
}
for(int i=1;i<=n;++i) a[i]=ret[i];
}
int main()
{
// setIO("input");
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i) e[i].scan();
sort(e+1,e+1+m);
for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) dis[i][j]=inf;
for(int i=1;i<=n;++i) dis[i][i]=0;
cnt=0,ans=inf;
for(int i=1;i<=n;++i) can[i][i]=1;
for(int i=1;i<=m;++i)
{
int x=e[i].x,y=e[i].y,d=e[i].d;
for(int j=1;j<=n;++j) tmp[j]=base[j];
Pow(tmp, d-cnt);
Mul(can,tmp);
for(int j=1;j<=n;++j) for(int k=1;k<=n;++k) dis[j][k]=min(dis[j][k], dis[j][x]+1+dis[y][k]);
for(int j=1;j<=n-1;++j) 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 printf("Impossible\n");
return 0;
}

  

CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化的更多相关文章

  1. CF576D. Flights for Regular Customers

    n<=150个点,m<=150条路,每条路Ai,Bi,Di表示Ai到Bi有一条有向边,使用他前至少要走Di条路,问1到n最少走几条路. 又是n^4过150的题.... 不同于传统的最短路, ...

  2. Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP

    题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...

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

    题目链接  Flights for Regular Customers 首先按照$d$的大小升序排序 然后分成$m$个时刻,每条路径一次处理过来. $can[i][j]$表示当前时刻$i$能否走到$j ...

  4. CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset+bfs

    CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset https://www.luogu.org/problemnew/show/CF57 ...

  5. 「CF576D」 Flights for Regular Customers

    「CF576D」 Flights for Regular Customers 对不起我又想网络流去了 你看这长得多像啊,走过至少多少条边就是流量下界,然后没上界 但是这个题求的最少走多少条边啊...完 ...

  6. 【CodeForces】576 D. Flights for Regular Customers

    [题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...

  7. Codevs 1305 Freda的道路(矩阵乘法 DP优化)

    1305 Freda的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description Freda要到Rainbow的城堡去玩了.我们可以认 ...

  8. Codeforces 576D - Flights for Regular Customers(bitset 优化广义矩阵乘法)

    题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,你初始在 \(1\) 号点,边上有边权 \(c_i\) 表示只有当你经过至少 \(c_i\) 条边的时候你才能经过第 \(i\) ...

  9. Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)

    题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...

随机推荐

  1. python练习题--计算总分平均分操作excel

    ''' 有一个存着学生成绩的文件,里面存的是json串,json串读起来特别不直观,需要你写代码把它都写到excel中,并计算出总分和平均分,json格式如下 { "1":[&qu ...

  2. python监控ip攻击,服务器防火墙

    '''写一个程序,监控nginx的日志,如果有人攻击就加入黑名单 把ip加入黑名单的策略是,1分钟之内,如果同一个ip请求超过200次,那就加入黑名单''' '''分析:1.打开文件 2.循环读取 3 ...

  3. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_7_HashMap存储自定义类型键值

    自定义类型做key值.必须要重写hashCode和equals方法 创建pserson类 有name个age两个成员变量.重写toString方法 key有重复,会被新的value值替换掉. key值 ...

  4. 应用安全-安全设备-Waf系列-软Waf-安全狗(Safedog)

    安装 - Linux 下载 http://download.safedog.cn/safedog_linux64.tar.gz wget http://download.safedog.cn/safe ...

  5. Implement Queue using Stacks(用两个栈实现队列)

    来源:https://leetcode.com/problems/implement-queue-using-stacks Implement the following operations of ...

  6. WPF ControlTemplate

    ControlTemplate:控件模板,顾名思义也就是定制特定的控件供公共调用,有点类似WinForm中对一些通用控件进行重写使用. ControlTemplate:控件模板主要有两个重要属性:Vi ...

  7. Spring Boot & Restful API 构建实战!

    作者:liuxiaopeng https://www.cnblogs.com/paddix/p/8215245.html 在现在的开发流程中,为了最大程度实现前后端的分离,通常后端接口只提供数据接口, ...

  8. Neo4j : 通过节点的 id属性 对节点进行查,改,删操作

    1. "查"操作 , 查找 id 属性 为 501的节点: MATCH (r) WHERE id(r) = 501 RETURN r 2. "改"操作, 更改 ...

  9. C#中ComboBox动态绑定赋值

    http://www.crifan.com/csharp_combobox_data_dynamic_binding/ C#中,已有一个List,想要动态的,绑定到ComboBox中. [解决过程] ...

  10. IMAP协议学习笔记(一)

    IMAP IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol ...