PTA 7-3 地铁一日游 (30 分)
?
森森喜歡坐地鐵。這個假期,他終于來到了傳說中的地鐵之城——魔都,打算好好過一把坐地鐵的癮!
魔都地鐵的計價規則是:起步價 2 元,出發站與到達站的最短距離(即計費距離)每 K 公里增加 1 元車費。
例如取?K?= 10,動安寺站離魔都綠橋站為 40 公里,則車費為 2 + 4 = 6 元。
為了獲得最大的滿足感,森森決定用以下的方式坐地鐵:在某一站上車(不妨設為地鐵站?A),則對于所有車費相同的到達站,森森只會在計費距離最遠的站或線路末端站點出站,然后用森森美圖 App 在站點外拍一張認證照,再按同樣的方式前往下一個站點。
坐著坐著,森森突然好奇起來:在給定出發站的情況下(在出發時森森也會拍一張照),他的整個旅程中能夠留下哪些站點的認證照?
地鐵是鐵路運輸的一種形式,指在地下運行為主的城市軌道交通系統。一般來說,地鐵由若干個站點組成,并有多條不同的線路雙向行駛,可類比公交車,當兩條或更多條線路經過同一個站點時,可進行換乘,更換自己所乘坐的線路。舉例來說,魔都 1 號線和 2 號線都經過人民廣場站,則乘坐 1 號線到達人民廣場時就可以換乘到 2 號線前往 2 號線的各個站點。換乘不需出站(也拍不到認證照),因此森森乘坐地鐵時換乘不受限制。
輸入格式:
輸入第一行是三個正整數?N、M?和?K,表示魔都地鐵有?N?個車站 (1 ≤?N?≤ 200),M?條線路 (1 ≤?M?≤ 1500),最短距離每超過?K?公里 (1 ≤?K?≤ 106),加 1 元車費。
接下來?M?行,每行由以下格式組成:
<站點1><空格><距離><空格><站點2><空格><距離><空格><站點3> ... <站點X-1><空格><距離><空格><站點X>
其中站點是一個 1 到?N?的編號;兩個站點編號之間的距離指兩個站在該線路上的距離。兩站之間距離是一個不大于 106?的正整數。一條線路上的站點互不相同。
注意:兩個站之間可能有多條直接連接的線路,且距離不一定相等。
再接下來有一個正整數?Q?(1 ≤?Q?≤ 200),表示森森嘗試從?Q?個站點出發。
最后有?Q?行,每行一個正整數?Xi**,表示森森嘗試從編號為 **Xi?的站點出發。
輸出格式:
對于森森每個嘗試的站點,輸出一行若干個整數,表示能夠到達的站點編號。站點編號從小到大排序。
輸入樣例:
6 2 6 1 6 2 4 3 1 4 5 6 2 6 6 4 2 3 4 5輸出樣例:
1 2 4 5 6 1 2 3 4 5 6 1 2 4 5 6 1 2 4 5 6代碼實現
#include <algorithm> #include <cstdio> #include <map> #include <queue> using namespace std; const int maxn = 205; const int INF = 0x3f3f3f3f; int d[maxn][maxn]; int terminal[maxn], vis[maxn][maxn]; map<int, int> been[maxn]; int n, m, k; int line[10000];int main() { #ifdef LOCALfreopen("E:\\Cpp\\1.in", "r", stdin); #endifscanf("%d%d%d", &n, &m, &k);for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)d[i][j] = (i == j) ? 0 : INF;int u, v, len;int fare;char ch;while (m--) {int len = 0;while (scanf("%d", &u)) {line[len++] = u;ch = getchar();if (ch == '\n') {terminal[line[0]] = terminal[line[len - 1]] = 1;for (int i = 0; i != len - 1; i += 2) {u = line[i], v = line[i + 2];d[v][u] = d[u][v] = min(d[u][v], line[i + 1]);}break;}}}for (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)d[i][j] = min(d[i][j], d[i][k] + d[k][j]);}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (i == j || d[i][j] == INF)continue;fare = 2 + d[i][j] / k;if (!been[i].count(fare) || been[i][fare] < d[i][j])been[i][fare] = d[i][j];}}int t, cur, first;queue<int> Q;scanf("%d", &t);while (t--) {first = 1;scanf("%d", &u);vis[u][u] = 1;Q.push(u);while (!Q.empty()) {cur = Q.front();Q.pop();for (int i = 1; i <= n; i++) {if (vis[u][i] || d[cur][i] == INF)continue;if (terminal[i]) {Q.push(i);vis[u][i] = 1;} else {fare = 2 + d[cur][i] / k;if (d[cur][i] == been[cur][fare]) {Q.push(i);vis[u][i] = 1;}}}}for (int i = 1; i <= n; i++) {if (vis[u][i]) {if (first) {printf("%d", i);first = 0;} elseprintf(" %d", i);}}printf("\n");}return 0; }?
?
總結
以上是生活随笔為你收集整理的PTA 7-3 地铁一日游 (30 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 激光脱毛原理
- 下一篇: 数据结构——用栈解决回文字符问题