标签:个数 color 矩阵相乘 code 有向图 tar other int ott
http://acm.hdu.edu.cn/showproblem.php?pid=2157
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3013 Accepted Submission(s): 1154
4 4
0 1
0 2
1 3
2 3
2
0 3 2
0 3 3
3 6
0 1
1 0
0 2
2 0
1 2
2 1
2
1 2 1
0 1 3
0 0
Sample Output
2
0
1
3
分析:
图论中,求两点(e.g. u,v)间长度为k的路径条数,可通过,求邻接矩阵的k次幂,对应找出A[u][v]值即可
问题转化求矩阵的快速幂!
#include "cstdio" #include "cstring" ///矩阵模型 struct matrix{ int a[20][20]; void init(int n) { for(int i=0;i<n;i++) memset(a[i],0,sizeof(a[i])); } }s,w; ///两矩阵相乘 matrix mul(matrix x,matrix y,int n) { matrix c; c.init(n); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { for(int k=0;k<n;k++) { c.a[i][j]+=x.a[i][k]*y.a[k][j]; } c.a[i][j] %= 1000; } } return c; } ///快速幂 matrix fastPow(matrix x,int k,int n)///x不要加引用 { matrix c; c.init(n); for(int i=0;i<n;i++)///E c.a[i][i]=1; while(k>0) { if(k&1) c=mul(c,x,n);///注意顺序 x=mul(x,x,n); k>>=1; } return c; } int main() { int n,m,t; while(~scanf("%d%d",&n,&m)&&n+m) { s.init(n); int x,y,k,a,b; for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); s.a[x][y]=1;///有向图 } scanf("%d",&t); for(int i=0;i<t;i++) { scanf("%d%d%d",&a,&b,&k); w=fastPow(s,k,n); printf("%d\n",w.a[a][b]); } } return 0; }
HDU2157 How many ways??---(邻接矩阵,图论,矩阵快速幂)
标签:个数 color 矩阵相乘 code 有向图 tar other int ott
原文地址:http://www.cnblogs.com/kimsimple/p/6597535.html