• <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 昂貴的聘禮

            分類:最短路

            題目分析與算法原型
                    這道題目其實就是一個最短路徑,不過是增加了等級限制,可以這樣考慮,增加一個節(jié)點n+1對應(yīng)第n+1件物品,對于前面1到n每一個物品,增加一條其到第n+1個物品的邊,該邊的權(quán)值為該物品的原來價格,對于題目給定的輸入數(shù)據(jù),若物品x,能用物品y換的一個優(yōu)惠價格p,則增加一條從x到y(tǒng)的邊,其權(quán)值為p,這樣一來,就構(gòu)好圖了,問題就轉(zhuǎn)換成了求從節(jié)點1到節(jié)點n+1的最短路徑問題了,當(dāng)然了,該題目還有一個等級限制,所以在運用Dijkastra的時候,應(yīng)該注意當(dāng)前的路徑中最大等級和最小等級間的差是否超過了給定的m,若超過了,則當(dāng)前的路徑就不行了,具體處理方法可以設(shè)置兩個變量_min,_max分別存的是路徑中最小和最大的等級,然后每當(dāng)要加入節(jié)點時判斷是否滿足,對于不滿足的點,標(biāo)記位仍然置為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 姓李

            在下有疑問,如果有一個點,第一次被選擇之后,發(fā)現(xiàn)其不符等級限制,那么就不更新了,可是有沒有可能最小的價錢是要經(jīng)過這個點呢?
            例如下面的數(shù)據(jù)
            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

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

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

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

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

            增加一個節(jié)點n+1, 妙!  回復(fù)  更多評論   

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

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


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


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

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            青青热久久综合网伊人| 人妻丰满?V无码久久不卡| 色综合久久88色综合天天 | 国产精品嫩草影院久久| 99久久国产亚洲高清观看2024 | 久久www免费人成看片| 久久精品国产第一区二区| 久久激情五月丁香伊人| 久久人人爽人人精品视频| 久久久这里有精品中文字幕| 久久综合视频网| 久久夜色精品国产噜噜麻豆| 久久久精品2019免费观看| 国产精品一久久香蕉国产线看| 久久综合九色综合欧美狠狠| 久久精品国产一区二区| 久久精品桃花综合| 72种姿势欧美久久久久大黄蕉| 99久久www免费人成精品| 亚洲欧美一区二区三区久久| 一本久道久久综合狠狠爱| 国内精品久久国产大陆| 久久er国产精品免费观看8| 99精品国产99久久久久久97| 久久99热狠狠色精品一区| 香蕉久久影院| 久久成人国产精品二三区| 久久免费99精品国产自在现线| 久久99精品国产麻豆宅宅| 国产成人久久精品激情| 色欲综合久久躁天天躁| 久久青青草原国产精品免费| 久久久久亚洲国产| 精品久久久久久无码国产| 人妻少妇久久中文字幕一区二区| 久久国产精品一区| 伊人色综合久久天天| 国产A级毛片久久久精品毛片| 国产精品热久久无码av| 久久亚洲精品无码AV红樱桃| 久久影院久久香蕉国产线看观看|