题目描述

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

输入

第一行包含三个整数n,m,k(1<=n<=40,1<=m<=1000,1<=k<=10^18)。
接下来m行,每行三个整数u,v,c(1<=u,v<=n,u不等于v,1<=c<=3),表示从u出发有一条到v的单向边,边长为c。
可能有重边。

输出

包含一行一个正整数,即第k短的路径的长度,如果不存在,输出-1。

样例输入

6 6 11
1 2 1
2 3 2
3 4 2
4 5 1
5 3 1
4 6 3

样例输出

4


solution

考虑只有边权为1的图。

拿一个矩阵G[i][j]表示i到j有多少走法。他的x次幂就是i走恰好x步到j的情况。

那么小于等于x的怎么求呢。

可以加一个计数点。把所有点向计数点连边,再加一个自环,也就是i-1步的方案也算进i步的方案。

现在考虑边权123

把每个点新建2个虚点,分别为 i+n i+n+n

如果i~j有x的边

连i+(x-1)*n~j

注意爆ll

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll unsigned long long
using namespace std;
int N,n,m;
ll goal;
ll Ans;
struct node{
ll v[][];
void cle(){
for(int i=;i<=N;i++)
for(int j=;j<=N;j++)v[i][j]=;
}
}G,A[],ans,tmp;
node operator *(node A,node B){
node C;C.cle();
for(int i=;i<=N;i++)
for(int j=;j<=N;j++){
for(int k=;k<=N;k++){
C.v[i][j]+=A.v[i][k]*B.v[k][j];
if(C.v[i][j]>1e19){C.v[][]=-;return C;}
}
}
return C;
}
bool pd(){
if(tmp.v[][]<){return ;}
ll sum=;
for(int i=;i<=n;i++){
sum+=(tmp.v[i][N]-);
if(sum>1e19)return ;
//cout<<tmp.v[i][N]<<' ';
}
//cout<<"sum "<<sum<<endl;
return sum<goal;
}
int main(){
cin>>n>>m>>goal;N=n+n+n+;//goal+=n;
for(int i=;i<=n;i++){
G.v[i][i+n]=G.v[i+n][i+n+n]=;
G.v[i][N]=;
}
G.v[N][N]=;
for(int i=,t1,t2,t3;i<=m;i++){
scanf("%d%d%d",&t1,&t2,&t3);
G.v[t1+(t3-)*n][t2]++;
}
A[]=G; for(int i=;i<=;i++)A[i]=A[i-]*A[i-];
for(int i=;i<=n;i++)ans.v[i][i]=;
for(int i=;i>=;i--){
tmp=ans*A[i];
if(pd())ans=tmp,Ans += (1ll << i);
if(i==&&pd()){puts("-1");return ;}
}
cout<<Ans<<endl;
return ;
}
/*
2 1 1
1 2 1 */

bzoj4386 Wycieczki的更多相关文章

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

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

  2. BZOJ4386 : [POI2015]Wycieczki

    将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第$k$短路的长度,注意对爆long long情况的处理. 时间复杂度$O(n^3\log k)$. #include<cstdio& ...

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

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

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

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

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

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

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

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

  7. Wycieczki 线性代数

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

  8. bzoj 4386: [POI2015]Wycieczki

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

  9. [POI2015]Wycieczki

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

随机推荐

  1. MySQL如何计算重要的指标,来确定配置是否正确

    在调优MySQL数据库和监控数据库时,很多朋友不知道如何下手,怎么来确定是不是参数设置的合理,下面给出一些如何计算指标,来确定数据库参数是否设置合理,希望给大家一些方法,去做MySQL数据库优化,最好 ...

  2. percona-zabbix-templates插件安装监控MySQL

    前期准备:被监控机已经安装好php 1.在zabbix客户端安装mysql监控插件rpm包 rpm -ivh https://www.percona.com/downloads/percona-mon ...

  3. layer 点击弹出图片

    今天做东西有一个功能:在列表点击图片弹出并放大显示,使用到了layer的页面层,下边是个小demo success:function (e) { var url = e.qrcode_url; //a ...

  4. 【版本控制——svn】

    reposity_name   //版本库 { Passwd //验证密码文件 Authz //权限控制 Server.conf //主配置 } Authz //权限控制 //由[groups]标签控 ...

  5. Clion 不能杀死进程

    描述 自己使用时发现点了结束按钮后,打开任务管理器,发现刚才运行的程序还在,并没有被杀死. 有时如果一个程序写了死循环,就会出现疯狂占用内存,最后不得不关机重启. 解决方案 这是他的社区有人也有这样的 ...

  6. 直接插入排序&希尔排序

    1.直接插入排序 时间复杂度O(n2) 工作原理: 通过构建有序序列,对于未排序数据,在已排序的序列中,从后向前扫描,找到相应的位置并插入. 插入排序在实现上,在从后向前扫描的过程中,需要反复把已排序 ...

  7. DataGridView重查后,返回原来所在行

    首先记录选中行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //查询前记录选中行 int _currentRow = 0; //int _cu ...

  8. 【Validation】林轩田机器学习基石

    这一节主要讲如何通过数据来合理的验证模型好不好. 首先,否定了Ein来选模型和Etest来选模型. (1)模型越复杂,Ein肯定越好:但是Eout就不一定了(见上一节的overfitting等) (2 ...

  9. 【 Logistic Regression 】林轩田机器学习基石

    这里提出Logistic Regression的角度是Soft Binary Classification.输出限定在0~1之间,用于表示可能发生positive的概率. 具体的做法是在Linear ...

  10. swift中的正则表达式

    swift中的t正则表达式 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串" ...