Autobus 方法记录( 三 )


#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N=75;const int inf=0x3f3f3f3f;//为了方便memset的使用,inf不可以开成1e9int n,m,u,v,t;int x,q,c,d;int init[N][N];int ans[N][N];int minn(int x,int y){ return x<y?x:y;}void mul(int a[N][N],int b[N][N])//矩阵乘法,仔细观察会发现转移方程像极了floyd{ int c[N][N]; memset(c,inf,sizeof(c)); for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]=minn(c[i][j],a[i][k]+b[k][j]); memcpy(a,c,sizeof(c));}int main(){ scanf("%d%d",&n,&m); memset(init,inf,sizeof(init)); for(int i=1;i<=n;i++) init[i][i]=0; for(int i=1;i<=m;i++) {scanf("%d%d%d",&u,&v,&t);init[u][v]=minn(init[u][v],t); } scanf("%d%d",&x,&q); x=minn(x,n); memset(ans,inf,sizeof(ans)); for(int i=1;i<=n;i++) ans[i][i]=0; while(x)//矩阵快速幂 {if(x&1) mul(ans,init);mul(init,init);x>>=1; } for(int i=1;i<=q;i++) {scanf("%d%d",&c,&d);if(ans[c][d]==inf) puts("-1");else printf("%d\n",ans[c][d]); } return 0;}【Autobus 方法记录】

推荐阅读