将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第$k$短路的长度,注意对爆long long情况的处理。

时间复杂度$O(n^3\log k)$。

#include<cstdio>
#define N 121
typedef long long ll;
int n,m,B,T,i,j,k,x,y,z,f[N][3],v[N];ll K,a[62][N][N],b[N][N],c[N][N],ans;
void mul(ll a[][N],ll b[][N],ll c[][N]){
for(int i=0;i<T;i++)for(int j=0;j<T;j++){
c[i][j]=0;
for(int k=0;k<T;k++)if(a[i][k]&&b[k][j]){
if(a[i][k]<0||b[k][j]<0){c[i][j]=-1;break;}
if(a[i][k]>K/b[k][j]){c[i][j]=-1;break;}
c[i][j]+=a[i][k]*b[k][j];
if(c[i][j]>K){c[i][j]=-1;break;}
}
}
}
bool check(){
ll t=0;
for(int i=0;i<T;i++)if(c[0][i]&&v[i]){
if(c[0][i]<0)return 0;
if(c[0][i]>K/v[i])return 0;
t+=c[0][i]*v[i];
if(t>K)return 0;
}
return t<K;
}
int main(){
scanf("%d%d%lld",&n,&m,&K);
for(T=i=1;i<=n;i++)for(j=0;j<3;j++)f[i][j]=T++;
a[0][0][0]++;
for(i=1;i<=n;i++){
for(j=0;j<2;j++)a[0][f[i][j]][f[i][j+1]]++;
a[0][0][f[i][0]]++;
}
while(m--)scanf("%d%d%d",&x,&y,&z),a[0][f[y][z-1]][f[x][0]]++,v[f[y][z-1]]++;
for(B=0;(1LL<<B)<=K*3;B++);
for(i=1;i<B;i++)mul(a[i-1],a[i-1],a[i]);
for(i=0;i<T;i++)b[i][i]=1;
for(i=B-1;~i;i--){
mul(b,a[i],c);
if(check())for(ans|=1LL<<i,j=0;j<T;j++)for(k=0;k<T;k++)b[j][k]=c[j][k];
}
ans++;
if(ans>K*3)ans=-1;
return printf("%lld",ans),0;
}

  

BZOJ4386 : [POI2015]Wycieczki的更多相关文章

  1. BZOJ4386[POI2015]Wycieczki / Luogu3597[POI2015]WYC - 矩乘

    Solution 想到边权为$1$的情况直接矩乘就可以得出长度$<=t$ 的路径条数, 然后二分check一下即可 但是拓展到边权为$2$,$3$ 时, 需要新建节点 $i+n$ 和 $i+2n ...

  2. BZOJ4386[POI2015]Wycieczki——矩阵乘法+倍增

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第 ...

  3. BZOJ4386 [POI2015]Wycieczki 矩阵+倍增

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4386 题解 一眼就可以看出来是邻接矩阵快速幂. 可是这里的边权不为 \(1\).不过可以发现, ...

  4. 【BZOJ-4386】Wycieczki DP + 矩阵乘法

    4386: [POI2015]Wycieczki Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 197  Solved: 49[Submit][Sta ...

  5. bzoj 4386: [POI2015]Wycieczki

    bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了 ...

  6. 【bzoj4386】[POI2015]Wycieczki 矩阵乘法

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第 ...

  7. [POI2015]Wycieczki

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入输出 ...

  8. BZOJ 4386 Luogu P3597 [POI2015]Wycieczki (矩阵乘法)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4386 (luogu) https://www.luogu.org/pro ...

  9. POI2015题解

    POI2015题解 吐槽一下为什么POI2015开始就成了破烂波兰文题目名了啊... 咕了一道3748没写打表题没什么意思,还剩\(BZOJ\)上的\(14\)道题. [BZOJ3746][POI20 ...

随机推荐

  1. EventBus学习入门

    EventBus Features What makes greenrobot's EventBus unique, are its features: Simple yet powerful: Ev ...

  2. hdu 1513

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 思路:正反分别求一次LCS,利用滚动数组对二取余滚动 #include<stdio.h&g ...

  3. Lattice 的 Framebuffer IP核使用调试笔记之datasheet笔记

    本文由远航路上ing 原创,转载请标明出处. 学习使用以及调试Framebuffer IP 核已经有一段时间了,调试的时候总想记录些东西,可是忙的时候就没有时间来写,只有先找个地方记录下,以后再总结. ...

  4. Android Programming: Pushing the Limits -- Chapter 1: Fine-Tuning Your Development Environment

    ADB命令 Application Exerciser Monkey Gradle ProGuard 代码重用 版本控制 静态代码分析 代码重构 开发者模式   ADB命令: @.adb help:查 ...

  5. HTML5学习之视频与音频(三)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. Python win32api提取exe图标icon

    转载地址: http://blog.csdn.net/gumanren/article/details/6129416 代码如下: # -*- coding: utf-8 -*- import sys ...

  7. 攻城狮在路上(叁)Linux(二十八)--- 打包命令:tar

    首先介绍一下tar打包命令的基本格式,下面的三种之间不能混淆. tar [-j|-z] [cv] [-f 新文件名] file1 file2 ...; tar [-j|-z] [tv] [-f 新文件 ...

  8. tornado使用(Mac)

    安装需求 Tornado 在 Python 2.5, 2.6, 2.7 中都经过了测试.要使用 Tornado 的所有功能,你需要安装 PycURL (7.18.2 或更高版本) 以及 simplej ...

  9. 2-04使用SQL语句创建数据库

    下面是创建数据库的一些语法: USE master--指向当前使用的数据库 GO--批处理的标志 CREATE DATABASE E_Market--创建E_market数据库 ON PRMARY-- ...

  10. 1-02 启动和停止Sql Sever的服务

    启动Sql  Sever服务的三种方式 1:后台启动服务. 2:Sql Sever配置管理员启动服务. 3:在运行窗口中使用命令启动和停止服务: 启动:net start mssqlsever. 停止 ...