codevs - 圖論 - Floyd

1、1009 產生數
  一開始我感到很困惑:這個和Floyd有什麼關係?然後就隨便寫了個用set存儲string的算法,結果就超時了。看了題解才明白兩個問題:首先哪裏用到了Floyd?既然涉及到數字變換,就可能會有傳遞關係,比如2可以變成5,5可以變成7,那麼2也可以變成7。就是這裏用到了Floyd的知識。下面看看代碼:

for (int k = 0; k < 10; k++) {
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (i == j || b[i][k] && b[k][j])
                    b[i][j] = true;
            }
        }
    }

  不過Floyd的三重循環的位置也是很重要的,最外層是中間數。
  然後第二個問題是怎麼計算最後有幾種可能。計算方式就是將每一位可能的變換數相乘。但是由於輸入的數字可能達到30位,最後的可能數也可能會很大,所以必須用大數相乘的方法,用一個數組存儲最後的結果:

// 最後計算總共有多少種可能
m[0] = 1; len = 1; // 初始化:至少有一種可能
for (int i = 0; i < number.length(); i++) {
    int rule = rules[number[i] - '0'];
    // 首先每一位都乘以當前的可能數 
    for (int j = 0; j < len; j++) {
        m[j] *= rule;
    }
    // 然後加上進位
    for (int j = 0; j < len; j++) {
        m[j+1] += m[j] / 10;
        m[j] %= 10;
    }
    // 如果最高位有進位,那麼len要加
    while (m[len]) {
        m[len+1] += m[len] / 10;
        m[len] %= 10;
        len++;
    }
}

2、1020 孿生蜘蛛
  這個題目的思路也不是特別複雜:首先計算每兩個點之間連通的代價(如果沒有路,就爲一個很大的數),然後遍歷每一個點,因爲飛蛾出現的位置並沒有聲明,然後計算最壞的情況。
  但是沒做出來,以後再說

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章