1. 程式人生 > >JZYZOJ1355 [usaco2007]奶牛賽跑 矩陣乘法 離散化

JZYZOJ1355 [usaco2007]奶牛賽跑 矩陣乘法 離散化

指定 運行 nbsp pri esp bound 第一次 乘法 urn

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 }
View Code

JZYZOJ1355 [usaco2007]奶牛賽跑 矩陣乘法 離散化