hdu2157How many ways??

矩阵路径方案的裸题,注意多组输入就好

这里有一个需要说明的知识点是,一个01的邻接矩阵经过k次幂之后map[i][j]就是从i->j经过k条路径的方案

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=1000;
struct mtix
{
	int w[50][50];
	mtix(){memset(w,0,sizeof(w));}
}a,b;
int n,m,q;
mtix mul(mtix e,mtix f)
{
	mtix c;
	for (int i=0;i<n;i++)
		for (int j=0;j<n;j++)
			for (int k=0;k<n;k++)
			c.w[i][j]=(c.w[i][j]+e.w[i][k]*f.w[k][j])%mod;
	return c;			
}
mtix mpow(int y)
{
	mtix e=b,f=a;
	for (;y;f=mul(f,f),y>>=1)
		if (y&1) e=mul(e,f);
	return e;
}
int main()
{
	for (int i=0;i<=50;i++) b.w[i][i]=1;
	while (~scanf("%d%d",&n,&m)&&n)
	{
		memset(a.w,0,sizeof(a.w));
		int x,y,z;
		for (int i=1;i<=m;i++)
		{
			scanf("%d%d",&x,&y);a.w[x][y]=1;
		}
		scanf("%d",&q);
		while (q--)
		{
			scanf("%d%d%d",&x,&y,&z);
			mtix ans=mpow(z);
			cout<<ans.w[x][y]<<endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/80879869