JZYZOJ1355 [usaco2007]奶牛赛跑 矩阵乘法 离散化
Posted 鲸头鹳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZYZOJ1355 [usaco2007]奶牛赛跑 矩阵乘法 离散化相关的知识,希望对你有一定的参考价值。
http://172.20.6.3/Problem_Show.asp?id=1355
写的时候本来想离散化,“1000^2的数组放一两个到函数里而已嘛,指定承受得住”,然后没离散化,然后就爆栈了,第一次知道直接爆栈是不报错的,只会运行之后return value 3221225477,学习了orz。
然后重写了一份离散化的……其实我觉得不离散化,数组就在外面声明也未尝不可啊,n<1000,n^3*logn,大概,不会超时吧(宛如那戏台上的老将军,背上插满了flag)。
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int maxn=210; 8 int n,m,s,t,siz; 9 struct nod{int x,y,v;}aa[maxn]; 10 struct mat{ 11 int e[maxn][maxn]; 12 mat(){memset(e,63,sizeof(e));} 13 };mat a; 14 int bb[maxn]={}; 15 mat mul(mat x,mat y){ 16 mat z; 17 for(int i=1;i<=siz;i++){ 18 for(int j=1;j<=siz;j++){ 19 for(int k=1;k<=siz;k++){ 20 z.e[i][j]=min(z.e[i][j],x.e[i][k]+y.e[k][j]); 21 } 22 } 23 }return z; 24 } 25 mat pow(mat x,int k){ 26 mat z; 27 for(int i=1;i<=siz;i++){ 28 z.e[i][i]=0; 29 } 30 while(k){ 31 if(k&1)z=mul(z,x); 32 x=mul(x,x); 33 k/=2; 34 } 35 return z; 36 } 37 int main(){ 38 scanf("%d%d%d%d",&n,&m,&s,&t); 39 for(int i=1;i<=m;i++){ 40 scanf("%d%d%d",&aa[i].v,&aa[i].x,&aa[i].y); 41 bb[2*i-1]=aa[i].x;bb[2*i]=aa[i].y; 42 }sort(bb+1,bb+1+m*2); 43 siz=unique(bb+1,bb+1+m*2)-bb-1; 44 s=lower_bound(bb+1,bb+1+siz,s)-bb; 45 t=lower_bound(bb+1,bb+1+siz,t)-bb; 46 for(int i=1;i<=m;i++){ 47 aa[i].x=lower_bound(bb+1,bb+1+siz,aa[i].x)-bb; 48 aa[i].y=lower_bound(bb+1,bb+1+siz,aa[i].y)-bb; 49 a.e[aa[i].x][aa[i].y]=aa[i].v; 50 a.e[aa[i].y][aa[i].x]=aa[i].v; 51 } 52 mat z=pow(a,n); 53 printf("%d\n",z.e[s][t]); 54 return 0; 55 }
以上是关于JZYZOJ1355 [usaco2007]奶牛赛跑 矩阵乘法 离散化的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 1708 usaco2007 Money奶牛的硬币
bzoj1703[Usaco2007 Mar]Ranking the Cows 奶牛排名*
[BZOJ] 1706: [usaco2007 Nov]relays 奶牛接力跑