[关闭]
@ysner 2018-08-01T01:08:23.000000Z 字数 1627 阅读 2145

专题总结(矩乘)

矩阵乘法 总结


行列对应关系

矩阵第行顺时针翻转度,与矩阵第列横向对应相乘(就是左右相乘),结果存在矩阵这一位置。

还有,给矩阵赋值时,注意第一维是横坐标,第二维是纵坐标

知识整理


原理:左边的枚举了的所有子集,括号内是子集大小;右边只是合并了所有子集大小相同的情况。

牛继电器

个点的有向图,求点到点经过条边的最短路。

看起来很板啊。
设起始矩阵,运算矩阵。初始化边权为,给矩阵赋边权,然后矩阵快速幂次(从原图走次,因原图相当于已走一条边),即可得答案。
上第行第列的意义是:从步所经最短距离。

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #define ll long long
  8. #define re register
  9. #define il inline
  10. #define max(a,b) ((a)>(b)?(a):(b))
  11. #define min(a,b) ((a)<(b)?(a):(b))
  12. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  13. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  14. using namespace std;
  15. const int N=105;
  16. int k,m,s,t,n,num[1000005];
  17. il ll gi()
  18. {
  19. re ll x=0,t=1;
  20. re char ch=getchar();
  21. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  22. if(ch=='-') t=-1,ch=getchar();
  23. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  24. return x*t;
  25. }
  26. struct Matrix
  27. {
  28. int a[205][205];
  29. Matrix(){memset(a,0,sizeof(a));}
  30. il int * operator [](re int x){return a[x];}
  31. Matrix operator *(Matrix b)
  32. {
  33. Matrix c;memset(c.a,63,sizeof(c.a));
  34. fp(k,1,n)
  35. fp(i,1,n)
  36. fp(j,1,n)
  37. c[i][j]=min(c[i][j],a[i][k]+b[k][j]);
  38. return c;
  39. }
  40. }S,T;
  41. int main()
  42. {
  43. k=gi();m=gi();s=gi();t=gi();
  44. memset(S.a,63,sizeof(S.a));memset(T.a,63,sizeof(T.a));
  45. fp(i,1,m)
  46. {
  47. re int w=gi(),u=gi(),v=gi();
  48. if(!num[u]) num[u]=++n;if(!num[v]) num[v]=++n;
  49. T[num[u]][num[v]]=T[num[v]][num[u]]=min(T[num[u]][num[v]],w);
  50. }
  51. fp(i,1,n) S.a[i][i]=0;
  52. while(k)
  53. {
  54. if(k&1) S=S*T;
  55. T=T*T;
  56. k>>=1;
  57. }
  58. printf("%d\n",S[num[s]][num[t]]);
  59. return 0;
  60. }

好像有个思路拓展:[TJOI2017]可乐题解

Homework

准备咕

Painting Machines

个集合选择个使得并集是,求方案数。

Permanent

咕咕咕

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注