Uva 10269 馬里奧與公主的歸途

2022-04-06 19:57:53 字數 2679 閱讀 9536

·馬里奧n次解救了公主,現在需要從魔王的宮殿返回。

·英文題,述大意:

給定乙個點數不超過100的無向圖,其中的點分為兩類:鄉村和城堡。

輸入a個鄉村,b個城堡(鄉村編號1~a,城堡編號a+1~b),並給出m條無向路徑及其需要花費的時間。不過還輸入了k,l,表示馬里奧有一雙可以使用k次的高階鞋子,使用一次可前往原本l時間內的所有地方(一瞬間)。不過有乙個限制條件是若使用鞋子加速,不能夠穿過城堡(注意,是穿過,到達城堡是可以的)。詢問從城堡a+b回到鄉村1的最短時間。

·分析:

高階鞋子是乙個很高階的東西。首先發現如果寫最短路演算法,那麼需要兩種路徑更新:①正常行走②瞬間移動。但一般的最短路演算法都是相鄰點之間走來走去,這為瞬間移動的狀態更新帶來了極大的不便。所以將兩種狀態更新不加處理地寫入同乙個最短路演算法是不明智之舉。

·先預處理一種情況得的最短路。另一種情況在前一情況的輔助下進行更新。如果我們能夠預先知道不穿過城堡的情況下每條路徑的正常行走需要花費的時間,在來抉擇這一段路需不需要用鞋子瞬移代替(當然,必須提醒的是,城堡之間也是可以用鞋子的,不要讀錯題啦)。任意兩點之間的最短路徑,讓我們想到使用floyd,要讓不穿過城堡,即使得更新中繼點不能為城堡就可以了。

·接下來的處理就很常規了。我們需要定義新狀態來組成點,以表示當前還有t次使用鞋子的機會,已經走到了u點,即f[t][u]。狀態更新就兩種方式:

①f[t][u]+(路徑時間)----->f[t][v]:表示正常行走

②f[t][u]+0------>f[t-1][v]:使用魔法鞋子

·大公尺餅使用的是spfa,卡到了vjudge這道題的第一名(now)。

1 #include2 #include3 #include4

#define inf 1000000000

5#define go(i,a,b) for(int i=a;i<=b;i++)

6using

namespace std;const

int n=102;7

struct stateu;queueq;

8int t,a,b,m,l,k,n,u,v,w,g[n][n],f[11][n],*f;bool inq[n][11];9

int main()

13 go(i,1,m)scanf("

%d%d%d

",&u,&v,&w),g[v][u]=g[u][v]=w;

14 go(k,1,a)go(i,1,n)go(j,1,n)g[i][j]=min(g[i][j],g[i][k]+g[k][j]);

1516 inq[n][k]=1;f[k][n]=0;q.push((state));while(!q.empty())

17),inq[i][u.t]=1:1;23

if(u.t&&g[u.u][i]<=l&&f[u.t-1][i]>f[u.u])f[u.t-1][i]=f[u.u],

24 !inq[i][u.t-1]?q.push((state)),inq[i][u.t-1]=1:1;25

}26}27

int ans=inf;go(i,0,k)ans=min(ans,f[i][1]);printf("

%d\n

",ans);

28 }return

0;}//

paul_guderian

·事後發現,這道題的點數較少,k無比地小。我們可以對程式稍做改進,可以達到更快的速度。我們的新方式是,queue只需要儲存節點,無需記錄時間。對於每個出隊節點,列舉它的所有可能時間進行狀態更新,這樣減少了搜尋的層數。

1 #include2 #include3 #include4

#define go(i,a,b) for(int i=a;i<=b;i++)

5#define inf 100000000

6using

namespace std;const

int n=102;queueq;

7int t,a,b,m,l,k,n,u,v,w,g[n][n],f[11][n],*f;bool

inq[n];

8int main()

12 go(i,1,m)scanf("

%d%d%d

",&u,&v,&w),g[v][u]=g[u][v]=w;

13 go(k,1,a)go(i,1,n)go(j,1,n)g[i][j]=min(g[i][j],g[i][k]+g[k][j]);

1415 f[k][n]=0;q.push(n);while(!q.empty())16}

25}26int ans=inf;go(i,0,k)ans=min(ans,f[i][1]);printf("

%d\n

",ans);

27 }return

0;}//

paul_guderian

那不滅不羈的倔強靈魂,還要經歷多少風霜。——汪峰《不經意間》

長翅膀的馬里奧

文科大三體驗工科研究生,想都不敢想 一 二零二零這一年感覺誰也挺不容易的,我也是換了一種形式沉澱了下來很多,摸索出適合自己的一套系統學習方法。二 最近一兩個月,除了要正常本科安排的培養課程,我還加入了一位教授的大資料開發專案團隊。在文科專業中能有工科的實驗專案機會去鍛鍊實屬難得,這也符合我自身向文工...

玩NDS的超級馬里奧感想!!

超級馬里奧 這個遊戲相信大家都非常熟悉,不用多介紹了吧!記得小的時候為之瘋狂 2007年的2月,再次在nds上玩到 現在玩遊戲的意義跟以前大大不同,以前好玩的遊戲就會玩,享受過程 現在玩遊戲就辛苦了,好玩不好玩似乎沒那麼重要了,當然還會盡量選擇好玩的遊戲,遊戲過程中還要思考究竟這是如何實現的?這個功...

繼坦克大戰後的馬里奧

用的是frame這個框架?還是叫窗體,不清楚,反正是個類沒錯,我新建了乙個類,名字叫做gameframe,把他繼承這個frame類.就是可以用來畫窗體,畫小人什麼的.然後在這個類中先確定視窗的大小,我寫的是800 600,把它寫成靜態全域性final變數,只需要去用它就可以了.窗體裡面寫什麼呢?首先...