• <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>
            隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
            數據加載中……

            Hdu 2363 Cycling(最短路)

            每個點有一個高度,從1到n使得最大高度和最小高度的差值最小,如果有相同高度,取路徑最短的。以前比賽的時候沒有去看,以為是很難的題,后來聽說要用二分,一直拖著,今天早上起來,讀了一下題目發現根本不用二分,點只有100個,可以對每個點的高度進行上下界枚舉求最短路保存最優值。這樣的話最壞復雜度是O(n^4),這里n == 100,而且測試樣例有100組,但是這個題目的限制條件決定了有很多地方可以剪枝。首先,可以先將每個點的高度進行升序排列,如果1或n不在所枚舉的高度上下界中,直接跳過。再者,如果當前枚舉的高度差大于先前算出來的最優值,直接跳過不算,最強的是:如果當前能夠算出解,那么上界再大亦可算出,直接break;

            代碼如下:
            #include <iostream>
            #include 
            <algorithm>
            using namespace std;

            int t;
            int alti[101];
            int n, m;
            int d[101], s[101];
            int map[101][101];
            int sor[101];

            int Dijkstra(int Min, int Max) {

                
            int i;

                
            for(i = 1; i <= n; i++{
                    
            if(alti[i] > Max || alti[i] < Min) {
                        d[i] 
            = 100000000;
                        s[i] 
            = 0;
                    }
            else {
                        d[i] 
            = map[1][i];
                        s[i] 
            = 0;
                    }

                }

                d[
            1= 0;
                s[
            1= 1;
                
                
            while(1{
                    
            int Mina = 100000000, u = -1;
                    
            for(i = 1; i <= n; i++{
                        
            if(alti[i] > Max || alti[i] < Min) 
                            
            continue;
                        
            if(!s[i] && d[i] < Mina) {
                            Mina 
            = d[i];
                            u 
            = i;
                        }

                    }

                    
            if(u == n)
                        
            return d[u];
                    
            if(u == -1)
                        
            return -1;
                    s[u] 
            = 1;
                    
            for(i = 1; i <= n; i++{
                        
            if(alti[i] > Max || alti[i] < Min) 
                            
            continue;
                        
            if(!s[i] && d[u] + map[u][i] < d[i]) {
                            d[i] 
            = d[u] + map[u][i];
                        }

                    }

                }

            }


            int main() {

                
            int i, j;
                scanf(
            "%d"&t);
                
            int a, b, c;
                
            while(t--{
                    scanf(
            "%d %d"&n, &m);

                    
            for(i = 1; i <= n; i++{
                        
            for(j = 1; j <= n; j++{
                            map[i][j] 
            = 100000000;
                        }

                    }

                    
            for(i = 1; i <= n; i++{
                        scanf(
            "%d"&alti[i]);
                        sor[i
            -1= alti[i];
                    }

                    sort(sor, sor 
            + n);

                    
            while(m--){
                        scanf(
            "%d %d %d"&a, &b, &c);
                        
            if(c < map[a][b]) {
                            map[a][b] 
            = map[b][a] = c;
                        }

                    }


                    
            int Min = 2000000000, path;

                    
            for(i = 0; i < n; i++{
                        
            for(j = i+1; j < n; j++{

                            
            if(alti[n] > sor[j] || alti[n] < sor[i])
                                
            continue;
                            
            if(alti[1> sor[j] || alti[1< sor[i])
                                
            continue;

                            
            if(sor[j] - sor[i] > Min)
                                
            break;

                            
            int yu;
                            yu 
            = Dijkstra(sor[i], sor[j]);
                            
            //printf("%d %d %d\n", sor[i], sor[j], yu);

                            
            if(yu + 1 && sor[j] - sor[i] == Min) {
                                
            if(yu < path)
                                    path 
            = yu;
                            }


                            
            if(yu + 1 && sor[j] - sor[i] < Min) {
                                Min 
            = sor[j] - sor[i];
                                path 
            = yu;
                            }


                            
            if(yu != -1)
                                
            break;
                        }

                    }

                    
            if(n == 1)
                        printf(
            "0 0\n");
                    
            else
                        printf(
            "%d %d\n",  Min, path);
                }

            }

            posted on 2009-03-10 09:14 英雄哪里出來 閱讀(531) 評論(1)  編輯 收藏 引用 所屬分類: ACM

            評論

            # re: Hdu 2363 Cycling(最短路)  回復  更多評論   

            你好我做這題的時候是二分高度差的,然后根據這個高度差做一遍dijkstra的,但是一直wa。這種寫法有什么問題么?
            2009-10-04 14:20 | rotten
            麻豆av久久av盛宴av| 亚洲欧美日韩中文久久| 国产精品九九九久久九九| 欧美精品久久久久久久自慰| 91精品国产高清91久久久久久| 青青草国产精品久久久久| 久久人人超碰精品CAOPOREN| 超级碰碰碰碰97久久久久| 久久精品中文无码资源站| 久久精品国产91久久综合麻豆自制 | 国产欧美久久一区二区| 国产精品成人无码久久久久久 | 伊人久久大香线焦AV综合影院| 国内精品伊人久久久久av一坑| 久久黄视频| 精品久久久久久无码中文字幕一区| 久久精品成人免费观看97| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 久久综合狠狠综合久久综合88| AA级片免费看视频久久| 亚洲乱码精品久久久久..| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久青青草原综合伊人| 久久久久久久97| 久久精品国产一区二区三区不卡 | 久久精品国产99国产精品| 久久w5ww成w人免费| 国内精品伊人久久久久妇| 国产综合精品久久亚洲| 99久久免费国产精品热| 无码AV波多野结衣久久| 2021国产精品午夜久久| 久久久WWW免费人成精品| 国产精品一区二区久久| 国产精品久久久久国产A级| 久久国产免费直播| 伊人情人综合成人久久网小说 | 无码国内精品久久人妻蜜桃| 精品人妻伦九区久久AAA片69| 久久成人小视频| 中文字幕乱码久久午夜|