将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第$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. CodeForces 282C(位运算)

    C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  2. 《Thinking in Java》十七章_容器深入研究_练习12(Page484)

    练习12: 练习使用HashMap / LinkedHashMap / TreeMap import java.util.HashMap; import java.util.LinkedHashMap ...

  3. iOS-OC-基本控件之UITextField

    UITextField IOS开发中必不可少的基本控件,本文主要是列出常用的属性及方法(注XCode版本为7.2) 文本框,可以理解为输入框或者显示框,即用户可以往里面输入文字或图片,可以输入当然也可 ...

  4. CLR via C#(02)-基元类型、引用类型、值类型

    http://www.cnblogs.com/qq0827/p/3281150.html 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架 ...

  5. AngularJS讲义-控制器

    在Angular中,控制器(Controller)就是基于JavaScript的构造方法,主要用来构造模型并建立模型和视图之间的数据绑定.控制器里面定义了应用程序的逻辑和行为. 通过ng-contro ...

  6. OGG异常处理

    ALTER REPLICAT LCMA1REP,BEGIN NOW 从最新的trail文件开始读取 ALTER REPLICAT LCMA1REP,EXTSEQNO 191(对应的 trail的序号 ...

  7. [Eclipse] Eclipse字体问题解决

    背景: Eclipse的字体总感觉有点问题,其中中文字体太小,不方便查看,今天网上搜索了一下,解决了问题,记录下来: 解决办法: Window --> Preferences --> Ge ...

  8. 在Salesforce中调用外部系统所提供的的Web Service

    这里需要提供外部service所对应的WSDL文件(Salesforce只支持从本地上传),并且提供的WSDL文件有如下两点要求: 1):wsdl 文件只能有一个binding,Salesforce是 ...

  9. MFC GDI绘图基础

    一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Wind ...

  10. Junit的简单使用

    Junit是一个很好用的单元测试工具,下面是使用Junit来测试方法的简单案例: import java.util.ArrayList; import java.util.Iterator; impo ...