51NOD 齊頭並進 最短路

2021-09-01 23:39:30 字數 1696 閱讀 1504

在乙個叫奧斯汀的城市,有n個小鎮(從1到n編號),這些小鎮通過m條雙向火車鐵軌相連。當然某些小鎮之間也有公路相連。為了保證每兩個小鎮之間的人可以方便的相互訪問,市長就在那些沒有鐵軌直接相連的小鎮之間建造了公路。在兩個直接通過公路或者鐵路相連的小鎮之間移動,要花費乙個小時的時間。

現在有一輛火車和一輛汽車同時從小鎮1出發。他們都要前往小鎮n,但是他們中途不能同時停在同乙個小鎮(但是可以同時停在小鎮n)。火車只能走鐵路,汽車只能走公路。

現在請來為火車和汽車分別設計一條線路;所有的公路或者鐵路可以被多次使用。使得火車和汽車盡可能快的到達小鎮n。即要求他們中最後到達小鎮n的時間要最短。輸出這個最短時間。(最後火車和汽車可以同時到達小鎮n,也可以先後到達。)

樣例解釋

在樣例中,火車可以按照1⟶3⟶4行駛,汽車1⟶2⟶4按照行駛,經過2小時後他們同時到過小鎮4。

單組測試資料。

第一行有兩個整數n 和 m (2≤n≤400, 0≤m≤n*(n-1)/2) ,表示小鎮的數目和鐵軌的數目。

接下來m行,每行有兩個整數u 和 v,表示u和v之間有一條鐵路。(1≤u,v≤n, u≠v)。

輸入中保證兩個小鎮之間最多有一條鐵路直接相連。

輸出乙個整數,表示答案,如果沒有合法的路線規劃,輸出-1。

4 2

1 33 4

題上說「為了保證每兩個小鎮之間的人可以方便的相互訪問,市長就在那些沒有鐵軌直接相連的小鎮之間建造了公路」,那麼就不會出現題中那個「中途不能同時停在同乙個小鎮」的問題,要麼鐵路一步直達公路繞路,要麼鐵路不能一步直達公路必一步直達,火車和汽車肯定有乙個是可以直達的。先判斷一下公路1到n能否一步直達,然後跑一遍dijkstra即可。

#include const int inf = 99999999;

int n, k, min, map[450][450], vis[450], dis[450];

int dijkstra(int s)

vis[s] = 1;

for (int i = 0; i < n; i++)

}vis[k] = 1;

for (int j = 1; j <= n; j++)

if (map[k][j] < inf)

if (!vis[j] && dis[j] > dis[k] + map[k][j])

dis[j] = dis[k] + map[k][j];

}return dis[n];

}int main()

if (!m || m == n * (n - 1) / 2)

if (map[1][n] == 1)

for (int i = 1; i <= n; i++)

for (int j = 1; j < i; j++)

if (map[i][j] == inf)

map[i][j] = map[j][i] = 1;

else if (map[i][j] == 1)

map[i][j] = map[j][i] = inf;

x = dijkstra(1);

if (x < inf)

printf("%d\n", x);

else printf("-1\n");

}return 0;

}

51nod 齊頭並進(最短路)

齊頭並進 在乙個叫奧斯汀的城市,有n個小鎮 從1到n編號 這些小鎮通過m條雙向火車鐵軌相連。當然某些小鎮之間也有公路相連。為了保證每兩個小鎮之間的人可以方便的相互訪問,市長就在那些沒有鐵軌直接相連的小鎮之間建造了公路。在兩個直接通過公路或者鐵路相連的小鎮之間移動,要花費乙個小時的時間。現在有一輛火車...

51Nod 1649 齊頭並進(最短路)

題目鏈結 在乙個叫奧斯汀的城市,有n個小鎮 從1到n編號 這些小鎮通過m條雙向火車鐵軌相連。當然某些小鎮之間也有公路相連。為了保證每兩個小鎮之間的人可以方便的相互訪問,市長就在那些沒有鐵軌直接相連的小鎮之間建造了公路。在兩個直接通過公路或者鐵路相連的小鎮之間移動,要花費乙個小時的時間。現在有一輛火車...

51Nod 1649 齊頭並進(最短路)

題目鏈結 在乙個叫奧斯汀的城市,有n個小鎮 從1到n編號 這些小鎮通過m條雙向火車鐵軌相連。當然某些小鎮之間也有公路相連。為了保證每兩個小鎮之間的人可以方便的相互訪問,市長就在那些沒有鐵軌直接相連的小鎮之間建造了公路。在兩個直接通過公路或者鐵路相連的小鎮之間移動,要花費乙個小時的時間。現在有一輛火車...