首页 > 其他分享 >[SCOI 2009] 迷路 (矩阵快速幂)

[SCOI 2009] 迷路 (矩阵快速幂)

时间:2024-03-13 21:56:02浏览次数:32  
标签:个点 迷路 样例 矩阵 SCOI leq int 2009 节点

[SCOI 2009]迷路

传送门

问题描述

Windy 在有向图中迷路了。 该有向图有 \({N}\) 个节点,Windy 从节点 \({1}\) 出发,他必须恰好在 \({T}\) 时刻到达节点 \({N}\)。
现在给出该有向图,你能告诉 Windy 总共有多少种不同的路径吗?
注意:Windy 不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。

输入格式:

第一行包含两个整数,\({N,T}\);
接下来有 \({N}\) 行,每行一个长度为 \({N}\) 的字符串。第 \({i}\) 行第 \({j}\) 列为 \({0}\) 表示从节点 \({i}\) 到节点 \({j}\) 没有边,为 \({1}\) 到 \({9}\) 表示从节点 \({i}\) 到节点 \({j}\) 需要耗费的时间。

输出格式:

包含一个整数,可能的路径数,这个数可能很大,只需输出这个数除以 \({2009}\) 的余数。

样例输入1:

2 2
11
00

样例输出1:

1

样例说明1:

\({1→1→2}\)

样例输入2:

5 30
12045
07105
47805
12024
12345

样例输出2:

852

说明:

对于 \({ 30 \% }\) 的数据,满足 \({2 \leq N \leq 5,1 \leq T \leq 30}\);
对于 \({ 100 \% }\) 的数据,满足 \({2 \leq N \leq 10,1 \leq T \leq 10^9}\)。

分析

1.这dio图里怎么还有自环呢?

哦 凑时间用的

2.既然是个图 那就画出来看看叭(过于抽象以至于未完成)


实在蚌埠住了

3.乂~它在矩阵快速幂专题里面诶,那就先打个板子叭

(打板子ing)
既然是矩阵快速幂,那肯定要推递推式啊

                          \({\large 试试就逝世}\)

假如输入是个邻接矩阵
我们先不看边权(假设边权都为1) 无权的都推不出来还推什么带权的

显而易得

这个邻接矩阵自乘\({T}\)次之后 \({a[1][n]}\) 就是答案

设\({F[i,j]}\)表示\({i \sim j}\)
若有连边则说明\({i \sim j}\)有一种路径
那么\({a[i][k]*a[k][j]}\)就相当于从\({i}\)走到\({k}\)的方案数乘以从\({k}\)到\({j}\)的方案数
将所有的\({a[i][k]*a[k][j]}\)加起来 就能得到多走\({1}\)的方案数
于是就有了方程:
                      \({\large F_t=\sum_{k=1}^n {f_{t-1}}[i,k] * f_1[k,j]}\)

所以\({F_1}\)就是最原始的矩阵aaaaaaaaa

但问题在于 这个矩阵的边权不为\({1}\)aaaaaaaaaaa

————————————————————
问佬佬()
。。。。。。。。。。。。。。。。。。。。。。
学成归来
————————————————————

于是我们知道了一个叫做拆点的东东

由于上限为9
我们将\({1}\)个点拆成\({9}\)个点,第\({i}\)个点拆成的第\({j-1}\)个点向第\({j}\)个点连一条边权为\({1}\)的边
那么\({i \sim j}\)有一条边权为\({k}\)的边等价于\({i}\)向\({j}\)拆成的第\({k}\)个点连边

最后再跑一遍矩阵快速幂就好啦~~~

code

Elaina's code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define INF 0x7fffffff
#define mst(a,b) memset(a,b,sizeof(a))
#define Elaina 0
const int N = 15;
const int mod = 2009;
int n,sn,t;

struct Mat{
	int n,m;
	int a[N*9][N*9];
	void clean(){
		mst(a,0);
	}
	void unit(){
		clean();
		for(int i=1;i<=n;i++){
			a[i][i]=1;
		}
	}
	void resize(int x,int y){ 
		n=x,m=y;
	}
	Mat operator * (const Mat &A) const {
		Mat res;
		res.resize(n,n);
		res.clean();
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				for(int k=1;k<=n;k++){
					res.a[i][j]=(a[i][k]*A.a[k][j]+res.a[i][j])%mod;
				}
			}
		}
		return res;
	}
};

Mat qpow(Mat A,int b){
	Mat res;
	res.resize(n,n);
	res.unit();
	while(b){
		if(b&1){
			res=res*A;
		}
		A=A*A;
		b>>=1;
	}
	return res;
}
Mat mat;
signed main(){
	cin>>n>>t;
	sn=n;
	n*=9;
	char x[N];
	
	mat.resize(n,n);
	for(int i=1;i<=sn;i++){
		for(int j=1;j<=8;j++){
			mat.a[(i-1)*9+j+1][(i-1)*9+j]=1;
		}
	}
	for(int i=1;i<=sn;i++){
		scanf("%s",x+1);
		for(int j=1;j<=sn;j++){
			if(x[j]>'0'){
				mat.a[(j-1)*9+1][(i-1)*9+x[j]-'0']=1;
			}
		}
	}
	mat=qpow(mat,t);
	cout<<mat.a[sn*9-8][1]%mod;
	return Elaina;
}

都看到这了,真的不点个赞吗(>ω<*)

标签:个点,迷路,样例,矩阵,SCOI,leq,int,2009,节点
From: https://www.cnblogs.com/Elaina-0/p/18070344

相关文章

  • 202009青少年软件编程(Scratch)等级考试试卷(一级)
    青少年软件编程(Scratch)等级考试试卷(一级)2020年9月第1题:【单选题】运行下图中脚本,角色所在位置用坐标表示为(    )A:(45,0)B:(0,145) C:(145,0) D:(100,0) 【正确答案】:C【试题解析】 :第2题:【单选题】Scratch软件自带的可以结束程序的按钮是(  )A:......
  • SCOI2024
    我曾认为过去的一切大多都不需要记录,写在看来,给未来的自己留下些稚嫩的文字又何尝不是一种美好呢?书接上回,由于CSP爆炸,WC没得打,被迫会老窝上网课。后来大概又去学了些数学,还去参加了省上的集训(天天打乒乓),学了些比较牛的东西,就省选了。由于NOIp的70分劣势加上实力本身的薄......
  • P2055 [ZJOI2009] 假期的宿舍
    原题链接题解这种让来让去让我想到了二分图!!注意细节!!剩余的就是模拟了code#include<bits/stdc++.h>usingnamespacestd;intstu[55],gohome[55],know[55][55];intn;intbelong[55]={0};intvis[55]={0};intsettle(intnow){if(vis[now])return0;vis[now]......
  • P2330 [SCOI2005] 繁忙的都市
    原题链接题解最小生成树和最短路不一样的兄弟code#include<bits/stdc++.h>usingnamespacestd;intfa[306]={0};intfinds(intnow){return(fa[now]==now?now:finds(fa[now]));}structnode{intx,y,v;booloperator<(constnode&b)const{returnv<b.v;}......
  • P2330 [SCOI2005] 繁忙的都市
    原题链接法一:运用结论 最小生成树也是最小瓶颈树,但最小瓶颈树不一定是最小生成树。所以这题我们可以直接套用最小生成树模板#include<bits/stdc++.h>usingnamespacestd;structG{intfrom,to,value;};Ga[8005];intfather[305],n,m;voidbuild(){for(in......
  • PKUWC+WC+SCOI 2024 游记汇总
    由于是我一次性补的,有些细节可能忘掉了/lh,就不会那么详细了。题外话感觉我可能不适合写游记(?),写得没意思,主要是也没有什么动力去写。写这种东西本来应该只是为了记录,但是我好像没有这种习惯,只是为了跟风才强迫自己去写一些东西。而且看起来很像流水账。而且还可能有一种“我考得好......
  • P3200 [HNOI2009] 有趣的数列 题解
    P3200[HNOI2009]有趣的数列感性地,我们认为在按照数值从小到大填数时每个时刻所填的奇数位的个数\(x\)不小于所填偶数位的个数\(y\)。我们考虑如何证明这一点。性质1:每一个偶数位上的数都要大于它前面所有的数。这一点应当是显然的。性质2:每一个偶数位上的数都不小于它的下......
  • [COI2009] PLAHTE 题解
    首先对于每一个矩形,若\(x_2<0\),就将\(x_1,x_2\)均乘上\(-1\)再交换,对于\(y_1,y_2\)也做同样的操作。我们建立一个操作序列a[0~1000],和一个数组\(d\),每一个操作用\((x,y)\)表示,就是在\(d\)内把所有\(0\)到\(x\)的位置加上\(y\)。我们再定义一种新的操作\([x,y......
  • SCOI 退役记
    02.21day-2开始写了,期望这不是真的退役记吧。但是不是的概率好小……这几天一直考试,怎么说呢,到差不差的,也就那个样子。归根结底,菜是原罪,和那些大佬相比我真的很很很菜啊。当时看commandblock,只是觉得他博客写的好,后来学的越多,越发现commandblock真tnnd的是个天才。不......
  • P2023 [AHOI2009] 维护序列
    原题链接code#definelllonglong#include<bits/stdc++.h>usingnamespacestd;lltree[410000]={0};llwait_mul[410000]={0};llwait_add[410000]={0};lln,p;inlinevoidread(ll&x){x=0;llflag=1;charc=getchar();while(c......