Bus System hdu 1690 (最短路 + long long int 處理)

來源:互聯網
上載者:User
/*<br />這個題目很簡單,只是資料比較大所以用long long int ,一開始沒有注意這個,以為是自己的BFS寫錯了,後來又用了<br />Floyd寫還是錯了。錯了很多回的時候終於AC,多虧了xwc在回來的路上提醒了下,回來的時候靈感一來就過了<br />跟著他真的學到了很多,但是我很多細節的地方還是非常需要注意的,這個暑假一直在繼續。。。<br />在審視題目的時候一定要注意資料的範圍<br />求很多兩點的最短路的時候Floyd效率高<br />*/</p><p>#include <iostream><br />#include <queue><br />#include <cstdio><br />#include <cstring><br />#include <cmath><br />using namespace std;</p><p>const long long int INF = 0x7fffffffffffff;//一開始這裡資料定義太小,一直wrong<br />const int N = 105;<br />long long int dis[N];<br />long long int cost[N][N];<br />long long int L[N];<br />long long int C[N];<br />long long int X[N];<br />bool hash[N];</p><p>struct node<br />{<br /> int num;<br />long long int dis;//這裡要定義這個,最短路可能會很大<br />friend bool operator < (node a, node b)<br />{<br />return a.dis > b.dis;<br />}<br />};</p><p>long long int distance(long long int a)<br />{<br />if(a < 0)<br />a = -a;<br />if(a == 0)<br />return 0;<br />if(a > 0 && a <= L[1])<br />return C[1];<br />if(a > L[1] && a <= L[2])<br />return C[2];<br />if(a > L[2] && a <= L[3])<br />return C[3];<br />if(a > L[3] && a <= L[4])<br />return C[4];<br />else<br />return INF;<br />}</p><p>long long int BFS(int s, int e, int n)<br />{//2570982 2010-07-05 12:36:46 Accepted 1690 62MS 284K 2787 B C++ 悔惜晟<br />node P, M;<br />priority_queue<node> Q;<br />memset(hash, false, sizeof(hash));<br />for(int i = 1; i <= n; i++)<br />{<br />dis[i] = cost[s][i];<br />if(cost[s][i] != INF && s != i)<br />{<br />P.num = i;<br />P.dis = dis[i];<br />Q.push(P);<br />}<br />}<br />hash[s] = true;<br />while(!Q.empty())<br />{<br />M = Q.top();<br />Q.pop();<br />if(hash[e])<br />break;<br />hash[M.num] = true;<br />for (int i = 1; i <= n; i++)<br />{<br />if(!hash[i] && dis[i] > M.dis + cost[M.num][i] && cost[M.num][i] != INF)<br />{<br />dis[i] = M.dis + cost[M.num][i];<br />P.num = i;<br />P.dis = dis[i];<br />Q.push(P);<br />}<br />}<br />}<br />return dis[e];<br />}</p><p>void Floyd(int n)<br />{//2570982 2010-07-05 12:36:46 Accepted 1690 62MS 284K 2787 B C++ 悔惜晟<br />for(int i = 1; i <= n; i++)<br />for(int j = 1; j <= n; j++)<br />for(int k = 1; k <= n; k++)<br />{<br />if(cost[j][k] > cost[j][i] + cost[i][k] && cost[j][i] != INF && cost[i][k] !=INF)<br />cost[j][k] = cost[j][i] + cost[i][k];<br />}<br />}<br /> int main()<br />{<br />int n, m, t;<br />int T = 1;<br />scanf("%d", &t);<br />while(t--)<br />{<br />for(int i = 1; i <= 4; i++)<br />scanf("%I64d", &L[i]);<br />for(int i = 1; i <= 4; i++)<br />scanf("%I64d", &C[i]);<br />scanf("%d %d", &n, &m);<br />for(int i = 1; i <= n; i++)<br />scanf("%I64d", &X[i]);<br />for(int i = 1; i <= n; i++)<br />for(int j = 1; j <= n; j++)<br />{<br />if(i == j)<br />cost[i][j] = 0;<br />else<br />cost[i][j] = INF;<br />}<br />for(int i = 1; i <= n; i++)<br />for(int j = 1; j <= n; j++)<br />{<br />long long int a = (long long int)fabs(1.0 * X[i] - X[j]);<br />//long long int a = X[i] - X[j];<br />long long int b = distance(a);<br />cost[i][j] = cost[j][i] = b;<br />}<br />int st, en;<br />long long int sum;<br />Floyd(n);<br />printf("Case %d:/n", T++);<br />while(m--)<br />{<br />scanf("%d %d", &st, &en);<br />sum = BFS(st, en, n);<br />//sum = cost[st][en];</p><p>if(sum == INF)<br />printf("Station %d and station %d are not attainable./n", st, en);<br />else<br />printf("The minimum cost between station %d and station %d is %I64d./n", st, en, sum);</p><p>}</p><p>}<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.