• <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 英雄哪里出來 閱讀(519) 評論(1)  編輯 收藏 引用 所屬分類: ACM

            評論

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

            你好我做這題的時候是二分高度差的,然后根據這個高度差做一遍dijkstra的,但是一直wa。這種寫法有什么問題么?
            2009-10-04 14:20 | rotten
            国产精品久久99| 国产精品久久久久久久app| 国产成人精品白浆久久69| 久久精品国产精品亚洲毛片| 亚洲天堂久久精品| 亚洲欧美国产精品专区久久| 人妻丰满AV无码久久不卡 | 亚洲午夜久久久久妓女影院| 久久精品天天中文字幕人妻| 久久国产美女免费观看精品| 久久精品国产亚洲AV香蕉| 97久久超碰国产精品旧版| 久久精品国产精品亚洲人人| 伊人久久大香线焦AV综合影院| 久久九九青青国产精品| 午夜视频久久久久一区| 久久99精品国产| 久久精品国产精品亚洲精品| 久久国产乱子精品免费女| 亚洲国产精品综合久久一线| 久久综合狠狠色综合伊人| 久久精品国产男包| 国内精品久久久久久久coent| 午夜欧美精品久久久久久久| 岛国搬运www久久| 精品久久久噜噜噜久久久 | 亚洲中文久久精品无码| 狠狠色伊人久久精品综合网| 天天爽天天狠久久久综合麻豆| 久久99精品国产麻豆不卡| 国产精品一区二区久久国产| 久久婷婷国产剧情内射白浆| 国产免费久久精品丫丫| 97久久精品国产精品青草| 久久久久人妻一区二区三区| 久久天天躁狠狠躁夜夜不卡| 欧美激情精品久久久久| 91精品国产乱码久久久久久| 久久综合给久久狠狠97色| 国产香蕉久久精品综合网| 日韩久久无码免费毛片软件|