网站模板带手机站,拖拽网站开发,营销型企业网站怎么制作,淘宝店招图片大全免费前言 正题
题目链接:https://www.luogu.org/problemnew/show/P3597 题目大意
问第kkk长的路径长度(非简单路径) 解题思路
先考虑kkk比较小时的情况#xff0c;我们可以求出长度为111的路径#xff0c;长度为222的路径#xff0c;然后以此类推找到第一个与前面的和到kkk就…前言 正题
题目链接:https://www.luogu.org/problemnew/show/P3597 题目大意
问第kkk长的路径长度(非简单路径) 解题思路
先考虑kkk比较小时的情况我们可以求出长度为111的路径长度为222的路径然后以此类推找到第一个与前面的和到kkk就可以得出答案。
但是这样并不能通过本题我们考虑倍增矩阵乘法倍增矩阵乘法倍增矩阵乘法。
首先因为边权只有1,2,31,2,31,2,3所以我们可以拆点(k−1)∗x(k-1)*x(k−1)∗x表示xxx出发的边上已经走了kkk步。
首先(k∗i)−gt;(k∗ik)(k*i)-gt;(k*ik)(k∗i)−(k∗ik)若一条边x−wgt;yx-_wgt;yx−wy那么(w−1)∗x−gt;y(w-1)*x-gt;y(w−1)∗x−y就可以了这样(i,j)(i,j)(i,j)就是iii到jjj的路径条数
用矩阵GkG_kGk中的(i,j)(i,j)(i,j)表示iii到jjj的路径长度≤2k\leq2^k≤2k的有多少条且(i,0)(i,0)(i,0)表示以iii为终点的长度≤2k\leq2^k≤2k有多少条。
那么有GkGk−1∗Gk−1G_kG_{k-1}*G_{k-1}GkGk−1∗Gk−1
然后若答案为ansansans那么有 ∑2xians\sum2^{x_{i}}ans∑2xians且Gover∏GxiGover\prod G_{x_i}Gover∏Gxi的话那么有 ∑i1n(Gover(i,0)−1)≤k\sum_{i1}^n (Gover(i,0)-1)\leq ki1∑n(Gover(i,0)−1)≤k (减111是因为有一种路径就是一直待在原地但这不会被计算入答案)
那么我们肯定要求ansansans尽量大那么我们从大开始枚举一个kkk。
若乘上GkG_kGk后满足条件就可以乘 codecodecode
#includecstdio
#includealgorithm
#includecstring
#define ll long long
using namespace std;
const ll Size125;
struct matrix{ll a[Size][Size];
}G[70],ove;
ll n,m,ans,k;
matrix operator *(matrix a, matrix b) {matrix c;memset(c.a,0,sizeof(c.a));for(ll i0;iSize;i)for(ll j0;jSize;j)for(ll k0;kSize;k)c.a[i][j]a.a[i][k]*b.a[k][j];return c;
}
bool check(matrix a){ll sum0;for(ll i1;in;i)if(k(suma.a[i][0]-1)) return 1;return 0;
}
int main()
{scanf(%lld%lld%lld,n,m,k);G[0].a[0][0]1;for(ll i1;in;i)ove.a[i][i]G[0].a[i][in]G[0].a[in][i2*n]G[0].a[i][0]1;for(ll i1;im;i){ll x,y,w;scanf(%lld%lld%lld,x,y,w);G[0].a[x(w-1)*n][y];}ll tot0;matrix tmp;while(tot){if(tot65)return puts(-1)0;G[tot]G[tot-1]*G[tot-1];if(check(G[tot])) break;}while((--tot)0){tmpove*G[tot];if(!check(tmp))ans(1lltot),ovetmp;}printf(%lld,ans);
}