• <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
            數(shù)據(jù)加載中……

            Hdu 2363 Cycling(最短路)

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

            你好我做這題的時候是二分高度差的,然后根據(jù)這個高度差做一遍dijkstra的,但是一直wa。這種寫法有什么問題么?
            2009-10-04 14:20 | rotten
            一本大道久久a久久精品综合| 97精品伊人久久久大香线蕉| 99久久人妻无码精品系列| 久久se精品一区二区| 久久久综合香蕉尹人综合网| 国内高清久久久久久| 亚洲狠狠久久综合一区77777| 蜜臀久久99精品久久久久久| 久久综合给合久久狠狠狠97色 | 久久天天躁狠狠躁夜夜avapp | 亚洲一区中文字幕久久| 欧美午夜A∨大片久久| 91精品国产高清久久久久久io| 狠狠色丁香婷婷综合久久来来去| 中文字幕精品久久| 国产激情久久久久影院老熟女免费| 久久久久亚洲精品男人的天堂| 亚洲AV日韩AV天堂久久| 久久99精品国产99久久6| 久久国产精品99国产精| 久久嫩草影院免费看夜色| 久久精品无码一区二区无码| 久久亚洲国产精品五月天婷| 国产亚洲美女精品久久久久狼| 亚洲伊人久久综合影院| 久久精品国产一区二区电影| 久久本道伊人久久| 国产婷婷成人久久Av免费高清| 久久99精品久久久大学生| 久久综合伊人77777麻豆| 激情久久久久久久久久| 久久久久免费精品国产| 国产精品美女久久久久| 国产高潮国产高潮久久久| 久久精品国产久精国产一老狼| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产欧美一区二区久久| 99re这里只有精品热久久| 国产精品久久久久无码av| 精品国产一区二区三区久久久狼| 色欲综合久久中文字幕网|