思路:dijkstra求最短路徑,然後對於同一出發點求到兩個出口之間的較小者,最後對於所有出發點求乙個最大值,即所謂的worst point.當然這題在空間上需要優化,用堆來優化是乙個可行的辦法。其實用乙個unsigned char型的陣列來記錄每兩點間距離就可以保證恰好不超空間。當然,網上說可以用floodfill可以更容易得到答案。
/*id: xpli1
prog: maze1
lang: c
*/#include
#define vetexnum 3801
#define dis_max 999999
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
unsigned char square[vetexnum][vetexnum]; // 初始化為四邊封閉
int da[vetexnum];
int db[vetexnum];
int flag[vetexnum];
int w,h;
char buf[80];
int va,vb;
void dij(int* d,int vetexnum,int v0)
d[v0] = 0; flag[v0] = 1;
for(i=1; iint min = dis_max;
for(j=0; jif(!flag[j])
if(d[j] < min)
}flag[v] = 1;
for(j=0; jd[j] = min + square[v][j];}}
}return;
}int main(void)
else }}
for(i=1; i<2*h; i++) else }
if(i&1 && buf[2*w] == ' ') else }
for(j=1; j<2*w; j++)
}else if((!(i&1)) && j&1)}}
}fgets(buf,sizeof(buf),fin);
for(j=1; j<2*w; j++) else }}
dij(da,w*h,va);
dij(db,w*h,vb);
int max = -1;
for(i=0; ireturn 0;
}
USACO Hamming Codes 解題報告
資料小,暴力搜尋可以搞定。但是推薦使用dfs,每個節點 數 有取與不取兩個分支。注意 0是必須出現的。證明如下 最終得到的結果序列中,0是必須出現的,證明如下 如果存在另乙個滿足要求的結果序列s 其最小值為a1 n 0,那麼序列s s n 是滿足條件的最小解,且首元素為0 id xpli1 prog...
USACO Closed Fences 解題報告
幾何題看著就很有畏懼感。這裡用的是最 的演算法,時間複雜度應該在n 2。還沒看別人的解題報告,不過我猜nlogn的解法是有的。比如判斷乙個fence是不是valid的時候,這裡將所有的線段兩兩比較,看是否相交。但是有個叫line sweep的演算法,可以在nlogn的時間複雜度內完成。既然accep...
Wiggle Subsequence解題報告
這道題和最長子序列,divisible subset題目類似,都可以用o n2 的時間複雜度完成。可以想象,對於第i個數,dp i dp j 1,當且僅當dp j 1 dp i 而且nums j 和nums i 的差值和j所處位置的差值符號相反。所以,如下 class solution if dp ...