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

            2009年7月29日

            題目鏈接:PKU 1135 Domino Effect

            分類:(Dijkastra+枚舉)  

            題目分析與算法原型
                     這道題目的意思大致是給你n個骨牌,以及某些骨牌之間的邊,這些邊的權值代表,從這條邊的某一端(某一骨牌)開始倒,一直倒到該邊的終點(該邊的另一個骨牌)所需的時間,然后題目的求的是,從編號為1的骨牌開始倒(注意,某一個骨牌倒的時候,連同與其相鄰的邊都同時開始往外面倒),求最后倒的骨牌的位置(在某兩個骨牌之間或者是剛給你的n個骨牌的其中一個)并輸出時間..........
                     其實,因為每個牌倒的同時都連帶與其連接的所有邊也同時倒,不難看出,當從骨牌1一直倒到某個骨牌x的時候,其實從1到x間的路徑必定是最短路徑,因為肯定是沿著最短的路徑才能先到達x么,考慮到這點,問題就已經解決一半了,我們可以先算出從1點出發的到其他所有點的最短路徑,然后取這些最短路徑中最長的那個點y,然后再枚舉所有與這個點相鄰的點      (這里需要除去 path[y]這點),假設z是其中一個點,然后找能使得(dis[y]+dis[z]+map[y][z])/2最長的那個點,若(dis[y]+dis[z]+map[y][z])/2>dis[y],則說明最后一個是y,若(dis[y]+dis[z]+map[y][z])/2=dis[y]則說明,最后一個處與y和z之間.........

            Code:

              1
            #include<stdio.h>
              2#define max 1000000000
              3#define len 505
              4
              5int n,m,a,b,l,map[len][len],dis[len],visit[len],path[len];
              6
              7void init()
              8{
              9    int i,j;
             10    for(i=1;i<=n;i++)
             11        for(j=1;j<=n;j++)
             12        {
             13            if(i==j)map[i][j]=0;
             14            else map[i][j]=max;
             15        }

             16}

             17void Dijkastra(int s)//s為源點
             18{
             19    int i,j;
             20    for(i=1;i<=n;i++)
             21    {
             22        dis[i]=map[s][i];
             23        visit[i]=0;
             24        if(i!=s&&dis[i]<max)path[i]=s;
             25        else path[i]=-1;
             26
             27    }

             28    visit[s]=1;
             29    for(i=1;i<n;i++)
             30    {
             31        int min=max,u;
             32        for(j=1;j<=n;j++)
             33            if(visit[j]==0&&dis[j]<min)
             34            {
             35                u=j;
             36                min=dis[j];
             37            }

             38
             39            if(min==max)return;//此語句對于非連通圖是必須的,表示當前已經不存在路徑了
             40
             41            visit[u]=1;
             42            for(j=1;j<=n;j++)
             43                if(visit[j]==0&&map[u][j]<max&&dis[u]+map[u][j]<dis[j])
             44                {    
             45                    dis[j]=dis[u]+map[u][j];
             46                    path[j]=u;
             47                }

             48    }

             49}

             50int main()
             51{
             52    int i,ccase=1;;
             53    while(scanf("%d%d",&n,&m)!=EOF)
             54    {
             55        if(n==0&&m==0)break;
             56        init();
             57        for(i=0;i<m;i++)
             58        {
             59            scanf("%d%d%d",&a,&b,&l);
             60            if(l<map[a][b])
             61            {
             62                map[a][b]=l;
             63                map[b][a]=l;
             64            }

             65        }

             66        Dijkastra(1);
             67        int _max=-1,num;
             68        for(i=1;i<=n;i++)
             69        {
             70            if(dis[i]>_max)
             71            {
             72                _max=dis[i];
             73                num=i;
             74            }

             75        }

             76        _max=-1;
             77        int pos;
             78        for(i=1;i<=n;i++)
             79        {
             80            if(i!=path[num]&&map[num][i]<max)
             81            {
             82                if(dis[num]+dis[i]+map[num][i]>_max)
             83                {
             84                    _max=dis[num]+dis[i]+map[num][i];
             85                    pos=i;
             86                }

             87            }

             88        }

             89        printf("System #%d\n",ccase++);
             90        if(dis[pos]+map[num][pos]==dis[num])
             91            printf("The last domino falls after %.1f seconds, at key domino %d.\n",(double)dis[num],num);
             92        else
             93        {
             94            double res=(double)(dis[pos]+map[num][pos]+dis[num])/2;
             95            if(num<pos)
             96                printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n",res,num,pos);
             97            else
             98                printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n",res,pos,num);
             99
            100        }

            101        printf("\n");
            102
            103    }

            104    return 0;
            105}

            106

            posted on 2009-07-29 10:14 蝸牛也Coding 閱讀(279) 評論(0)  編輯 收藏 引用

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

            導航

            統計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品亚洲精品国产色婷| 内射无码专区久久亚洲| 久久久www免费人成精品| 久久国产精品无| 亚洲va久久久噜噜噜久久男同| 久久午夜无码鲁丝片秋霞| 中文字幕乱码人妻无码久久| 久久AV高清无码| 99久久精品免费看国产一区二区三区 | 久久精品国产亚洲av高清漫画| 亚洲国产精品无码久久久蜜芽| 嫩草影院久久99| 国产美女亚洲精品久久久综合| 999久久久免费精品国产| 亚洲欧美日韩精品久久亚洲区| 久久久久高潮毛片免费全部播放| 久久久久一级精品亚洲国产成人综合AV区| 国产人久久人人人人爽| 免费精品99久久国产综合精品| 97久久婷婷五月综合色d啪蜜芽| 91亚洲国产成人久久精品网址| 久久综合狠狠综合久久综合88| 欧美精品一区二区久久| 国产精品免费久久| 国产午夜精品久久久久免费视 | 久久99国产精品久久99小说 | 久久久久综合国产欧美一区二区| 亚洲精品国产字幕久久不卡| 伊人伊成久久人综合网777| 91久久精品电影| 国产精品久久精品| 日韩精品久久久久久免费| 久久精品免费全国观看国产| 久久影院亚洲一区| 久久久久国产一区二区| 久久久国产精品网站| 久久国产精品-久久精品| 国产亚洲精品美女久久久| 久久人人爽爽爽人久久久| 日韩人妻无码一区二区三区久久| 国产成人久久精品一区二区三区|