0526-Boat Travel
Project Eularに逃避していました。
ダイクストラで解答したところ、あまり速度が出なかった。
解説を読んだらワーシャルフロイドっぽいアルゴリズムで解いていたので、そのようにしたところ4倍ぐらい速くなった。
実装(C++/Include省略)
const lli INF=0x3B9ACA00; uint d[MAX_V][MAX_V]; int n,k,t,t1,t2,t3,c; edge tmped; int getd(int x,int y){ if(x>y)return d[y][x]; return d[x][y]; } int main(){ for(;;){ n=readint();k=readint(); if((n|k)==0) break; memset(d,0x7F,sizeof(d)); for(int i=0;i<n;i++){ d[i][i]=0; } for(int i=0;i<k;i++){ t=readint(); if(t==1){ c=1; t1=readint()-1;t2=readint()-1;t3=readint(); if(d[t1][t2]>t3){ d[t1][t2]=t3; d[t2][t1]=t3; for(int x=0;x<n;x++){ for(int y=0;y<n;y++){ d[x][y]=min(min(d[x][y],d[x][t1]+d[t1][t2]+d[t2][y]),d[x][t2]+d[t2][t1]+d[t1][y]); } } } } else { t1=readint()-1;t2=readint()-1; if(d[t1][t2]>INF){ fwrite("-1\n", 1, 3, stdout); } else { puti(d[t1][t2]); } } } } }