1. 程式人生 > >pku openjudge 我愛北大 floyd演算法求最短路徑

pku openjudge 我愛北大 floyd演算法求最短路徑

總時間限制: 
1000ms 
記憶體限制: 
65535kB
描述

“紅樓飛雪,一時英傑……”耳邊傳來了那熟悉的歌聲。而這,只怕是我最後一次聽到這個聲音了。

想當年,我們曾經懷著豪情壯志,許下心願,走過靜園,走過一體,走過未名湖畔的每個角落。

想當年,我們也曾慷慨高歌,瞻仰民主與科學,瞻仰博雅塔頂,那百年之前的遺韻。

沒錯,我愛北大,我愛這個校園。

然而,從當我們穿上學位服的那一刻起,這個校園,就再也不屬於我。它只屬於往事,屬於我的回憶。

沒錯,這,是我在北大的最後一日。此時,此景,此生,此世,將刻骨難忘。

再也沒有了圖書館自習的各種紛紜,再也沒有了運動場上的揮汗如雨,有的,只是心中永遠的不捨,與牽掛。

夜,已深。人,卻不願離去。天邊有一顆流星劃過,是那般靜,寧謐。

忍不住不回頭,我的眼邊,有淚光,劃過。

這時候,突然有一位路人甲從你身旁出現,問你:從XX到XX怎麼走?

索性,就讓我再愛你一次。因為,北大永遠在你心中。北大的地圖,永遠在你的心中。

輕手揮揚,不帶走一分雲彩。

輸入
輸入分為三個部分。
第一個部分有P+1行,第一行為一個整數P,之後的P行表示北大的地點。
第二個部分有Q+1行,第一行為一個整數Q,之後的Q行每行分別為兩個字串與一個整數,表示這兩點有直線的道路,並顯示二者之間的矩離(單位為米)。
第三個部分有R+1行,第一行為一個整數R,之後的R行每行為兩個字串,表示需要求的路線。
p<30,Q<50,R<20
輸出
輸出有R行,分別表示每個路線最短的走法。其中兩個點之間,用->(矩離)->相隔
注意:明晰floyd動態規劃的步驟:初始化 三個for迴圈的順序 還要注意輸出的格式,一定要看清楚
#include<iostream>
#include<map>
#include<string>
using namespace std;
map<string,int> sour;
map<int ,string> yuan;
int p,q,r;
#define maxn 40
#define infi 1000000;
class dist
{
public:
	int len;
	int pre;
};
dist D[maxn][maxn];
void output(int s,int e) { if(s==e) { cout<<yuan[s]; return; } output(s,D[s][e].pre); cout<<"->"<<'('<<D[D[s][e].pre][e].len<<')'<<"->"<<yuan[e]; } int main() { string tem; cin>>p; for(int i=0;i<p;i++) { cin>>tem; sour.insert(pair<string,int>(tem,i)); yuan.insert(pair<int,string>(i,tem)); } //對矩陣進行初始化 for(int i=0;i<p;i++) { for(int j=0;j<p;j++) { if(i!=j) { D[i][j].len=infi; D[i][j].pre=-1; } else { D[i][j].len=0; D[i][j].pre=i; } } } cin>>q; string fol1,fol2; int len; //對矩陣中的元素進行修改 for(int i=0;i<q;i++) { cin>>fol1>>fol2>>len; if(D[sour[fol1]][sour[fol2]].len>len) { D[sour[fol1]][sour[fol2]].len=len; D[sour[fol1]][sour[fol2]].pre=sour[fol1]; D[sour[fol2]][sour[fol1]].len=len; D[sour[fol2]][sour[fol1]].pre=sour[fol2]; } } int i,j,g; //用動態規劃對元素的內容進行修改 for(g=0;g<p;g++) { for(i=0;i<p;i++) { for(j=0;j<p;j++) { if(D[i][g].len+D[g][j].len<D[i][j].len) { D[i][j].len=D[i][g].len+D[g][j].len; D[i][j].pre=D[g][j].pre; } } } } cin>>r; for(int i=0;i<r;i++) { cin>>fol1>>fol2; output(sour[fol1],sour[fol2]); cout<<endl; } return 0; }