青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

pku 3635

2009年8月1日

題目鏈接:PKU 3635 Full Tank ?
  
題目分類:一道有趣的bfs(有點難度)

題目分析與算法原型

         題目大意是,給你n個城市(n最大可以到1000)以及每個城市對應的油價,這些城市間有m條路徑及每條路徑對應的所連接的兩個城市以及路徑的長度(每條路徑連接兩個城市)也告訴了你,給你一輛車,車的油箱儲備量也已知,最后給你剛才n個城市中的某兩個a和b,問你用給你的汽車從a能不能到達b,若能,怎么走才能使得你所花費的油錢最小(路徑每走一單位需要用1升油),并輸出這個最小的花費..........
        老實說,從看到這道題目開始的將近一整天時間里面我都沒有什么好的思路,知道是一道廣搜,但是還不是特別清楚買油的方式,最后參考了某位大牛前輩的思路,才有了一點眉目(哎,搜索太爛了,有待提高啊)。大致做法是定義一個數(shù)組dis[][],其中dis[i][j]代表汽車到達i號城市,且油箱里面還有j升油的時候的最小花費,創(chuàng)建一個最小堆維護(不用堆優(yōu)化鐵定超時,剛開始堆優(yōu)化沒寫好,貢獻了2次TLE),從隊列中取出最小花費的那個,然后以它作為節(jié)點擴展開來(注意,這道題目城市數(shù)比較大,采用鄰接表存儲比較好)..........
        
        具體做法如下:
 1.每次從隊列中彈出第一個元素,因為采用了最小堆維護,這樣可以確保彈出的元素一定是隊列中花費最小那個元素

 2. 假設彈出的元素對應的是dij[C][L](既是在C號城市,剩下L升汽油時的最小花費)然后我們每次只買一升油,此時所花費的錢算上剛才一共是dij[C][L]+price[C](price[C]代表C號城市的油價),然后更新,取dij[C][L+1]=Min(dij[C][L+1],dij[C][L]+price[C]),新擴展的元素入隊列

3.枚舉每個和C號城市相互鄰接的城市X,如果當前儲備的油L>=d(d為C到X的路徑長度),說明可以開到X城市,此時油剩下L-d,然后更新,取dis[X][L-d]=Min(dis[X][L-d],dis[C][L]),相應的元素入隊列.


Code:

  1
#include<stdio.h>
  2#define INF 1000000000
  3#define len 1005
  4int map[len][len],price[len],cost[len][len],n,m,count;
  5int dis[len][105],flag[len][105];
  6struct node
  7{
  8    int city,fuel,money;
  9}
queue[1000000];
 10void down_min_heap(int n,int h)//n表示堆元素的個數(shù),從0開始編號,從h開始往下調整
 11{
 12    int i=h,j=2*i+1;
 13    node temp=queue[i];
 14    while(j<n)
 15    {
 16        if(j<n-1&&queue[j].money>queue[j+1].money)j++;//若右孩子存在,且右孩子比較小,取右
 17        if(temp.money<queue[j].money)break;
 18        else
 19        {
 20            queue[i]=queue[j];
 21            i=j;
 22            j=2*i+1;
 23        }

 24    }

 25    queue[i]=temp;
 26}

 27void up_min_heap(int s)
 28{
 29    while (s>0&&queue[s].money<queue[(s-1)/2].money)     //從s開始往上調整
 30    
 31        node tt=queue[s];
 32        queue[s]=queue[(s-1)/2];
 33        queue[(s-1)/2]=tt;
 34        s = (s-1)/2
 35    }

 36}

 37node pop()
 38{
 39    node res=queue[0];
 40    queue[0]=queue[count-1];
 41    count--;
 42    down_min_heap(count,0);
 43    return res;
 44}

 45void push(int c,int f,int m)
 46{
 47    queue[count].city=c;
 48    queue[count].fuel=f;
 49    queue[count].money=m;
 50    count++;
 51    up_min_heap(count-1);
 52}

 53int bfs(int cap,int start,int end)
 54{
 55    int i,j;
 56    count =0;
 57    for(i=0;i<n;i++)
 58        for(j=0;j<=cap;j++)
 59            dis[i][j]=INF,flag[i][j]=0;
 60    
 61    push(start,0,0);
 62    dis[start][0= 0
 63
 64    while (count>0)
 65    {
 66        node u=pop();
 67        int city=u.city,left=u.fuel;
 68        if (flag[city][left]) continue
 69        if (city==end) break
 70        if (left<cap && dis[city][left+1]>dis[city][left]+price[city])
 71        
 72            dis[city][left+1]=dis[city][left]+price[city]; 
 73            push(city, left+1, dis[city][left+1]); 
 74        }

 75        for (i=1; i<= map[city][0];i++
 76        
 77            int v=map[city][i], nc=cost[city][i]; 
 78            if (left>=nc && dis[v][left-nc]>dis[city][left])
 79            
 80                dis[v][left-nc]=dis[city][left]; 
 81                push(v,left-nc,dis[v][left-nc]); 
 82            }

 83        }

 84        flag[city][left] = 1
 85    }

 86    return dis[end][0]; 
 87}

 88int main()
 89{
 90    int i,q;
 91    while(scanf("%d%d",&n,&m)!=EOF)
 92    {
 93        for(i=0;i<n;i++)
 94        {
 95            scanf("%d",&price[i]);
 96            map[i][0]=0;
 97        }

 98        for(i=0;i<m;i++)             //采用鄰接表的方式存
 99        {
100            int a,b,l;
101            scanf("%d%d%d",&a,&b,&l);
102            map[a][++map[a][0]]=b;
103            cost[a][map[a][0]]=l;
104            map[b][++map[b][0]]=a;
105            cost[b][map[b][0]]=l;
106        }

107        scanf("%d",&q);
108        for(i=0;i<q;i++)
109        {
110            int cap,start,end;
111            scanf("%d%d%d",&cap,&start,&end);
112            int res=bfs(cap,start,end);
113            if(res<INF)printf("%d\n",res);
114            else printf("impossible\n");
115        }

116    }

117    return 1;
118}

119

posted on 2009-08-01 16:02 蝸牛也Coding 閱讀(1593) 評論(2)  編輯 收藏 引用

評論

# re: pku 3635 2009-08-01 16:12 Vincent

=.=最短路徑吧...O(n^2)?  回復  更多評論   

# re: pku 3635 2009-08-04 17:25 付翔

不錯   回復  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

導航

統(tǒng)計

常用鏈接

留言簿(8)

隨筆檔案(78)

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲第一区色| 性亚洲最疯狂xxxx高清| 久久久亚洲影院你懂的| 亚洲国产精品一区| 日韩视频一区二区三区在线播放| 欧美午夜性色大片在线观看| 久久精品二区三区| 男女av一区三区二区色多| 亚洲欧美激情视频在线观看一区二区三区| 亚洲综合首页| av72成人在线| 久久国产一二区| 亚洲视频图片小说| 久久午夜电影网| 亚洲在线一区二区三区| 久久精品三级| 校园春色国产精品| 欧美精品一区三区在线观看| 久久资源在线| 国产麻豆一精品一av一免费| 亚洲欧洲日韩综合二区| 国产一区二区三区成人欧美日韩在线观看| 欧美搞黄网站| 国精产品99永久一区一区| 在线亚洲高清视频| 亚洲精品免费在线| 久久不射电影网| 欧美一区二区三区婷婷月色| 欧美日本簧片| 91久久精品国产91久久性色tv| 国产综合久久久久久鬼色| 一本一本久久a久久精品综合妖精| 亚洲国产精品123| 久久久久久9| 久久久久久成人| 国产精品视频午夜| 一区二区欧美在线| 在线综合亚洲欧美在线视频| 欧美成人国产va精品日本一级| 久久免费视频这里只有精品| 国产视频精品xxxx| 午夜精品www| 欧美一级视频一区二区| 国产精品啊啊啊| 9久草视频在线视频精品| 99精品99| 欧美屁股在线| 日韩视频在线观看国产| 99av国产精品欲麻豆| 欧美—级在线免费片| 欧美成人资源| 亚洲三级免费| 欧美激情麻豆| 亚洲精品欧美专区| 亚洲免费小视频| 国产精品久久久久婷婷| 午夜精品视频在线观看| 久久精品视频亚洲| 黄色成人小视频| 麻豆精品在线观看| 亚洲欧洲日韩在线| 亚洲欧美资源在线| 国产一区二区三区免费在线观看| 欧美呦呦网站| 久久综合狠狠综合久久综青草| 一区二区视频免费在线观看| 久久综合中文字幕| 亚洲国产精品热久久| 中文精品视频一区二区在线观看| 欧美日韩亚洲一区二| 在线一区二区日韩| 久久婷婷国产综合精品青草| 1024成人| 欧美三级乱码| 久久成人18免费观看| 亚洲福利电影| 欧美一级一区| 亚洲高清精品中出| 欧美啪啪一区| 久久成人免费视频| 亚洲国产精品高清久久久| 亚洲午夜影视影院在线观看| 国产精品亚洲综合一区在线观看 | 欧美日韩视频专区在线播放| 在线亚洲+欧美+日本专区| 欧美一区二区免费| 亚洲国产片色| 国产精品欧美精品| 久久综合中文色婷婷| 一个色综合av| 欧美不卡高清| 午夜免费在线观看精品视频| 亚洲国产精品999| 国产精品久久久久秋霞鲁丝| 久久久久9999亚洲精品| 夜夜嗨一区二区三区| 免费日韩成人| 欧美专区中文字幕| 在线亚洲欧美| 亚洲电影一级黄| 国产精品区免费视频| 免费在线视频一区| 久久av一区二区三区| 一区二区日韩| 亚洲国产成人在线播放| 久久国产欧美精品| 一区二区欧美视频| 亚洲国产精品www| 国产三级欧美三级| 欧美日韩播放| 欧美jizz19性欧美| 欧美一级专区免费大片| 一区二区三区 在线观看视频| 媚黑女一区二区| 久久精品国产2020观看福利| 99视频有精品| 亚洲国产精品电影| 国产一区日韩欧美| 国产精品日韩在线观看| 欧美日韩国产va另类| 老司机精品久久| 欧美一区二区日韩| 亚洲影院一区| 在线中文字幕一区| 亚洲国产综合在线| 亚洲高清在线精品| 欧美成人69av| 欧美ab在线视频| 蜜桃av综合| 美国十次了思思久久精品导航| 久久精彩免费视频| 久久九九免费视频| 久久精品在线| 久久一区二区三区国产精品| 久久精品国产精品亚洲综合| 性色av香蕉一区二区| 午夜国产精品影院在线观看| 亚洲欧美激情四射在线日 | 欧美精品在线视频观看| 欧美mv日韩mv国产网站| 欧美aa在线视频| 欧美精品18+| 欧美日韩国产影院| 欧美视频精品一区| 欧美香蕉大胸在线视频观看| 国产精品va在线| 国产精品入口麻豆原神| 国产日产精品一区二区三区四区的观看方式 | 国产亚洲a∨片在线观看| 国产精品日韩欧美一区| 国产日韩在线视频| 国产一区二区三区电影在线观看| 国产一区二三区| 亚洲国产成人不卡| 一卡二卡3卡四卡高清精品视频| 日韩视频中文字幕| 中国亚洲黄色| 欧美一区二区精品| 久久午夜激情| 亚洲高清资源| 中文av字幕一区| 午夜精品福利在线| 久久国产精品久久久久久久久久| 久久亚洲欧洲| 欧美日韩一区二区三区| 国产精品揄拍一区二区| 国产在线精品成人一区二区三区| 亚洲高清123| 亚洲一区精彩视频| 久久网站免费| 99视频一区| 欧美在线亚洲一区| 欧美国产日韩一区二区三区| 国产精品看片你懂得| 影音先锋另类| 亚洲专区欧美专区| 老司机aⅴ在线精品导航| 亚洲精品国久久99热| 欧美中文字幕第一页| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美亚洲不卡| 亚洲第一黄色| 亚洲一二三四区| 美日韩精品视频免费看| 一本色道久久| 久久久亚洲高清| 国产精品家教| 亚洲精品裸体| 久久精品国产第一区二区三区| 亚洲人成网站影音先锋播放| 亚洲欧美三级伦理| 欧美精品一区二区精品网| 国产一区免费视频| 午夜久久美女| 最新69国产成人精品视频免费| 香港久久久电影| 欧美激情视频网站| 国产一区二区三区四区在线观看 | 久久成年人视频| 欧美视频在线看|