達內杯--H 技術員BangFu 

 這題的確是一道好題,很好的將狀態dp以及圖論的最短路徑,這里上面的權值表示的花費的錢,另外還有很多約束問題,

 首先大體描述下這道題,就是一個技術員,遍歷N個節點,首先他一開始在0號節點,且是星期一,然后遍歷1..N-1 編號的節點,這里要求每個節點只能走一次,而且必須每個節點都得走到,最后還要回到0號節點,而且從一個定點到另一個頂點是要花費p天的時間,還要要一定的錢,而且在每個節點也至少得待一天的時間,最后的最后,要我們解決的問題是,首先判定他是否能夠每個節點都能走到,另外,如果能又是否能在星期六或星期天到,若是,那么我們至少得花多少錢呢!

  問題已經很清晰了,現在的問題就是如何求了,按照我開始的思路,首先判定這是否是一個遍歷所有節點的回路,然后既然這是一個狀態dp的問題,那么肯定是涉及到狀態的改變的,那么狀態是什么呢,這里就是走過的節點,可以作為狀態,如果已經走過,那么為1,否則為0,那么N個節點可以表示成一個二進制串,然后相對應的十進制值就是狀態數,如上,我們如何判斷狀態的合法性,這里就是走過的節點就不要回去了,所以就很好判斷了,也就是說每一位只能置1一次,好,搞過之后,我們在找狀態方程,因為這里好像很隱藏,

因為問題描述當中,有要求的天數,和花費的錢數,那么這個方程到底怎么表示呢!

 這里設dp[state][des][d]  這個方程的意思就是狀態為state時,且到達了des節點,且此時是星期,另外這個值就是達到這點所花費的錢   0<=state<2^N,1<=des<=N-1,0<=d<7

   然后就是初始化問題,dp[0][0][0]=inf,dp[1][0][0]=0,然后就是用bfs遍歷找出求最短路勁了,這里最短路勁也好求,首先在輸入的時候,建立鄰接表,bfs的用隊列維護,這里就如上所述,所涉及的要保存的信息很多,于是我們想到結構體,用結構體來表示節點以及邊,這樣,這個過程就很好辦了,當然我們知道bfs的過程中,還有一個visit的,這里也需要建立類似的標記,這里要和dp有同樣的大小,

 這樣搞過之后,最后就很好辦了,首先dp[2^N-1][1....N][D] ,循環遍歷在目標1....N個節點中看看有沒到0號節點的,兩個fou循環,找出最小值,同時判斷是否能夠在星期六和星期天道,這些都很好辦了,,接下來就可以去是實現了,,就是苦力活了,,有許多的細節,要考慮全面!

  

   下面的代碼就是寫給自己看的,成功AC!
    

View Code