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

pku 3635

2009年8月1日

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

題目分析與算法原型

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

不錯   回復  更多評論   


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


<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

導航

統計

常用鏈接

留言簿(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>
            狠狠久久婷婷| 亚洲男人影院| 久久全国免费视频| 久热精品视频在线观看一区| 亚洲电影下载| 久久精品亚洲热| 国产情侣久久| 亚洲欧美日韩在线一区| 亚洲女女做受ⅹxx高潮| 亚洲成人在线视频播放| 久久精品国内一区二区三区| 久久久www免费人成黑人精品 | 欧美中文在线视频| 欧美日韩精品三区| 欧美暴力喷水在线| 久久丁香综合五月国产三级网站| 亚洲人成7777| 久久精品99国产精品日本| 国产精品国产三级国产普通话99 | 麻豆91精品91久久久的内涵| 国产精品自在欧美一区| 午夜激情亚洲| 欧美中文字幕视频| 国产精品羞羞答答xxdd| 欧美日韩三区| 亚洲视频一起| 久久精品国产一区二区电影| 亚洲电影免费观看高清完整版在线观看 | 麻豆国产精品一区二区三区 | 久久黄色小说| 妖精视频成人观看www| 国产精品亚洲综合天堂夜夜| 欧美中文字幕久久| 欧美黄色片免费观看| 欧美亚洲免费在线| 免费的成人av| 久久网站免费| 国产精品欧美一区二区三区奶水| 久久国产精品毛片| 欧美黄色影院| 久久久国产视频91| 欧美午夜在线视频| 亚洲人成在线观看| 欧美了一区在线观看| 免播放器亚洲| 国产一区深夜福利| 欧美a一区二区| 久热精品视频在线观看| 在线一区二区视频| 亚洲欧美日韩直播| 99精品国产热久久91蜜凸| 欧美久久久久中文字幕| 国产一区二区久久久| 久久久久久高潮国产精品视| 亚洲激情在线观看视频免费| 欧美一级在线亚洲天堂| 国产精品久线观看视频| 亚洲福利视频网站| 一区免费在线| 国产欧美一二三区| 久久人人97超碰精品888| 国产三级精品三级| 久久中文久久字幕| 亚洲国产欧美日韩精品| 麻豆成人在线播放| 亚洲美女一区| 国产精品国产馆在线真实露脸 | 女生裸体视频一区二区三区| 亚洲国产精品黑人久久久| 国产精品99一区二区| 久久久久一区二区三区| 久久不射网站| 欧美99在线视频观看| 曰韩精品一区二区| 久久五月天婷婷| 欧美高清你懂得| 欧美精品色一区二区三区| 欧美激情1区2区3区| 久久久久综合网| 亚洲欧美激情视频在线观看一区二区三区 | 国产精品美腿一区在线看 | 欧美黑人在线观看| 国产日韩欧美在线视频观看| 久久精品中文字幕免费mv| 欧美一区国产二区| 亚洲一区成人| 亚洲影院污污.| 亚洲影院在线| 久久精品国亚洲| 欧美一区二区黄色| 午夜精品一区二区三区四区| 亚洲影视中文字幕| 亚洲欧美日韩在线不卡| 亚洲你懂的在线视频| 亚洲综合成人在线| 欧美亚洲在线| 久久激情综合网| 久久亚洲午夜电影| 欧美国产三级| 国产精品爽爽ⅴa在线观看| 国产精品第十页| 国产噜噜噜噜噜久久久久久久久| 国产情侣久久| 欧美日韩国产二区| 欧美视频日韩视频| 亚洲国产成人精品久久| 亚洲视频一二| 久久一本综合频道| 欧美亚洲色图校园春色| 亚洲精品综合在线| 亚洲国产高潮在线观看| 一区免费在线| 国产一区导航| 狠狠久久婷婷| 亚洲国内自拍| 亚洲欧美日韩一区二区三区在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲尤物视频网| 精品不卡在线| 亚洲国产成人av在线| 欧美国产在线观看| 欧美亚洲免费在线| 久久高清一区| 日韩午夜精品| 欧美日韩国产精品一区| 亚洲国产美女精品久久久久∴| 欧美激情第9页| 国产亚洲欧洲997久久综合| 亚洲午夜精品17c| 日韩午夜中文字幕| 欧美女同在线视频| 亚洲一区欧美| 国产女优一区| 久久久国产91| 久久综合色8888| 亚洲美女色禁图| 一区二区欧美精品| 国产日韩精品一区观看| 久久麻豆一区二区| 欧美日韩亚洲综合一区| 亚洲一区二区三区视频| 亚洲婷婷在线| 一区视频在线播放| 久久久99爱| 久久久精品国产一区二区三区| 免费永久网站黄欧美| 欧美一区二区| 欧美日韩一区在线播放| 一区二区三区四区五区在线| 亚洲福利小视频| 久久久久青草大香线综合精品| 欧美精品在线播放| 美日韩丰满少妇在线观看| 精品成人一区二区| 小辣椒精品导航| 欧美jizz19性欧美| 亚洲深夜影院| 伊人久久噜噜噜躁狠狠躁| 欧美成人精品1314www| 日韩视频中午一区| 欧美一区二区三区在| 亚洲国产精品123| 国产精品大全| 免费在线看一区| 国产日韩精品视频一区| 麻豆精品精华液| 国产精品久久久久久久久久久久久| 99国产精品视频免费观看| 91久久夜色精品国产九色| 欧美视频中文字幕在线| 久久美女艺术照精彩视频福利播放| 亚洲日本欧美在线| 日韩视频精品在线| 亚洲高清不卡在线观看| 中文国产一区| 在线播放亚洲一区| 亚洲曰本av电影| 夜夜嗨av一区二区三区网站四季av | 欧美日韩在线三区| 久久久精品国产99久久精品芒果| 欧美精品日韩| 亚洲福利小视频| 国产噜噜噜噜噜久久久久久久久| 亚洲激情黄色| 亚洲国产你懂的| 亚洲电影在线观看| 最新亚洲视频| 中日韩视频在线观看| 欧美性生交xxxxx久久久| 欧美激情免费在线| 久久久久久香蕉网| 亚洲欧美国产精品桃花| 狂野欧美激情性xxxx欧美| 亚洲精品日产精品乱码不卡| 欧美一级久久久| 亚洲免费成人| 欧美日韩亚洲一区三区| 亚洲成人自拍视频| 亚洲美女视频在线观看| 一区二区三区在线观看国产|