• <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>

            pku 1062

            2009年7月24日

            題目鏈接:PKU 1062 昂貴的聘禮

            分類:最短路

            題目分析與算法原型
                    這道題目其實就是一個最短路徑,不過是增加了等級限制,可以這樣考慮,增加一個節點n+1對應第n+1件物品,對于前面1到n每一個物品,增加一條其到第n+1個物品的邊,該邊的權值為該物品的原來價格,對于題目給定的輸入數據,若物品x,能用物品y換的一個優惠價格p,則增加一條從x到y的邊,其權值為p,這樣一來,就構好圖了,問題就轉換成了求從節點1到節點n+1的最短路徑問題了,當然了,該題目還有一個等級限制,所以在運用Dijkastra的時候,應該注意當前的路徑中最大等級和最小等級間的差是否超過了給定的m,若超過了,則當前的路徑就不行了,具體處理方法可以設置兩個變量_min,_max分別存的是路徑中最小和最大的等級,然后每當要加入節點時判斷是否滿足,對于不滿足的點,標記位仍然置為1,但是下面的操作就Continue略過就行了。


            Code:

             1
            #include<stdio.h>
             2#include<string.h>
             3#define max 0x7fffffff
             4#define len 110
             5
             6int m,n,p,l,x,map[len][len],i,j,t,v,dis[len],flag[len],dj[len],min,u;
             7int _min,_max;
             8
             9void init()
            10{
            11    for(i=1;i<=n;i++)
            12        for(j=1;j<=n;j++)
            13        {
            14            if(i==j)map[i][j]=0;
            15            else map[i][j]=max;
            16        }

            17}

            18
            19void dij()
            20{
            21    int xiao,da,go;
            22    for(i=1;i<=n+1;i++)dis[i]=map[1][i];
            23    flag[1]=1;
            24
            25    for(i=1;i<=n;i++)
            26    {
            27        min=max;
            28        go=0;
            29        for(j=1;j<=n+1;j++)
            30            if(flag[j]==0&&dis[j]<min)
            31            {
            32                u=j;
            33                min=dis[j];
            34            }

            35        flag[u]=1;
            36        if(dj[u]<_min)
            37        {
            38            xiao=_min;
            39            _min=dj[u];
            40            if(_max-_min>m)
            41            {
            42                go=1;
            43                _min=xiao;
            44            }

            45        }

            46        else if(dj[u]>_max)
            47        {
            48            da=_max;
            49            _max=dj[u];
            50            if(_max-_min>m)
            51            {
            52                go=1;
            53                _max=da;
            54            }

            55        }

            56        if(go)continue;
            57        for(j=1;j<=n+1;j++)
            58            if(flag[j]==0&&map[u][j]<max&&dis[u]+map[u][j]<dis[j])
            59                dis[j]=dis[u]+map[u][j];
            60    }

            61    
            62}

            63
            64int main()
            65{
            66    while(scanf("%d%d",&m,&n)!=EOF)
            67    {
            68        init();
            69        memset(flag,0,sizeof(flag));
            70        for(i=1;i<=n;i++)
            71        {
            72            scanf("%d%d%d",&p,&l,&x);
            73            map[i][n+1]=p;
            74            dj[i]=l;
            75            for(j=1;j<=x;j++)
            76            {
            77                scanf("%d%d",&t,&v);
            78                map[i][t]=v;
            79            }

            80        }

            81        _max=dj[1];
            82        _min=dj[1];
            83        dij();
            84        printf("%d\n",dis[n+1]);
            85    }

            86    return 0;
            87}

            88
            89

            posted on 2009-07-24 19:30 蝸牛也Coding 閱讀(757) 評論(4)  編輯 收藏 引用

            評論

            # re: pku 1062 2009-09-12 16:36 姓李

            在下有疑問,如果有一個點,第一次被選擇之后,發現其不符等級限制,那么就不更新了,可是有沒有可能最小的價錢是要經過這個點呢?
            例如下面的數據
            1 5
            10000 3 2
            2 8000
            3 8000
            3000 4 1
            4 400
            3000 2 1
            4 500
            1000 3 1
            5 100
            100 2 0

            難道結果不是5700嗎?
            不懂啊,如果有空幫忙解釋一下,我的郵箱lijh_402@yeah.net  回復  更多評論   

            # re: pku 1062 2009-10-01 22:44 JustCodeIT

            我也不太懂樓主的算法原理,為什么你不用枚舉呢?
            同樓上的疑問?  回復  更多評論   

            # re: pku 1062 2010-07-20 14:52 walker01

            增加一個節點n+1, 妙!  回復  更多評論   

            # re: pku 1062 2011-06-23 11:09 Firefrog

            樓主的代碼雖然可以AC,但是是錯的。
            你試一下這個數據:
            1 4
            10000 3 2
            2 1
            3 3
            1000 2 2
            4 1
            3 1
            1000 3 1
            4 2
            100 4 0
            正確答案應該是:
            105
            樓主的代碼輸出的是 1001。  回復  更多評論   

            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導航

            統計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久93精品国产91久久综合| 久久久婷婷五月亚洲97号色| 999久久久国产精品| 国产精品成人久久久久三级午夜电影| 国产福利电影一区二区三区久久老子无码午夜伦不 | 国产精品无码久久久久久| 色综合久久综合网观看| 热久久国产欧美一区二区精品| 久久久亚洲欧洲日产国码是AV| 久久精品无码一区二区无码 | 久久久一本精品99久久精品88| 久久99精品久久久久久动态图| 久久精品国产精品亚洲| 精品久久久无码21p发布| 97久久香蕉国产线看观看| 亚洲午夜精品久久久久久app| 国产综合久久久久| 怡红院日本一道日本久久| 久久天天躁狠狠躁夜夜不卡| 国产精品成人99久久久久| 国内精品人妻无码久久久影院导航| 久久精品成人免费看| 无码人妻精品一区二区三区久久久 | 国产69精品久久久久777| 国产精品中文久久久久久久| 国产农村妇女毛片精品久久| 久久综合给合久久狠狠狠97色 | 无码人妻久久一区二区三区免费| 精品久久久久久久久久中文字幕 | 亚洲天堂久久精品| av无码久久久久久不卡网站| 久久人妻无码中文字幕| 亚洲精品乱码久久久久久蜜桃| 日韩欧美亚洲综合久久影院d3| 99久久er这里只有精品18| 伊人久久精品无码av一区| 伊人久久成人成综合网222| 久久婷婷五月综合成人D啪| 久久精品国产WWW456C0M| 国产视频久久| 国产精品gz久久久|