NYOJ 20 吝嗇的國度 續

2021-08-27 01:49:10 字數 1745 閱讀 4750

還是《吝嗇的國度》,研讀了別人的較為高效的**,無論是時間開銷,還是空間開銷都要小很多啊,截圖為證:

我的所有執行:

52ms的是我參照別人的寫的**,時間開銷比我的小將近一半,記憶體開銷僅有我的五分之一。

不過,我自己又將他的改進了一下,雖然記憶體稍稍大了點,但時間開銷為40ms,排名第一啊,哈哈!

wronganswer那次是因為忘了在遞迴中標記start,runtimeerror那次是為了除錯時檢視陣列內容,就把陣列開了100,結果除錯完忘了改回來,直接提交了,陣列越界,唉...

題目中要求從起始城市出發,輸出經過每個城市時,之前的那個城市的編號。這樣,相鄰兩個城市之間的關係實質上已經表示出來了,也就是說,存放之前城市編號的那個陣列,儲存了乙個有向圖,如下圖所示:

輸入的測試資料為:

紅色箭頭建立的的圖,即為陣列中存放之前城市編號所建立的有向圖。

按照這種思路建立有向圖,需要解決箭頭方向的問題,即確定哪個城市離出發城市更近。這裡有兩種方法:

(一),建圖的過程中,不管箭頭方向,在整個圖建立完成之後,從出發城市開始調整箭頭方向。

(二),建圖的過程中,根據出發城市的位置調整箭頭方向,整個圖建立完成時,也就是乙個正確的有向圖。

思路(一)也就是高人的思路,**如下:

#include #include int map[100005];

void adjust(int currentcity)

}int main()

else

}adjust(startcity);

map[startcity] = - 1;

for (i = 1; i < citynum; i++)

printf("%d\n", map[i]);

} return 0;

}

思路(二)是我自己的,因為我發現不考慮方向建立圖時,會出現方向的多次調整,影響效率,所以我就想在建立圖的過程中就考慮方向,**如下:

#include #include int map[100005];

bool flag[100005];

void adjustincludestart(int currentcity)

}void adjustexcludestart(int currentcity)

}int main()

map[cityb] = citya;

flag[cityb] = true;

}else if (flag[cityb])

map[citya] = cityb;

flag[citya] = true;

}else

else

}} for (i = 1; i < citynum; i++)

printf("%d\n", map[i]);

} return 0;

}

nyoj20 吝嗇的國度

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...

NYOJ 20 吝嗇的國度

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...

NYOJ 20 吝嗇的國度

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...