• <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 閱讀(273) 評論(0)  編輯 收藏 引用

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

            導航

            統計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久午夜无码鲁丝片秋霞| 中文字幕无码久久精品青草| 亚洲AV无码久久精品狠狠爱浪潮| 久久精品国产男包| 无码国内精品久久人妻蜜桃| 国内精品伊人久久久久AV影院| 久久综合久久久| 国产色综合久久无码有码| 国产精品久久永久免费| 人妻精品久久久久中文字幕| 久久久久成人精品无码中文字幕| 99久久精品国产一区二区蜜芽| 四虎久久影院| 国产一区二区精品久久凹凸| 日韩乱码人妻无码中文字幕久久| 欧美久久精品一级c片片| 国产色综合久久无码有码| 久久精品中文字幕一区| 精品人妻久久久久久888| 久久91精品国产91| 久久996热精品xxxx| 99久久久精品免费观看国产| 亚洲综合久久久| 久久高潮一级毛片免费| 四虎国产精品免费久久5151| 无码精品久久久久久人妻中字| 久久婷婷五月综合成人D啪| 亚洲午夜精品久久久久久人妖| 久久亚洲AV成人出白浆无码国产 | 99精品久久精品一区二区| 26uuu久久五月天| 精品国产一区二区三区久久久狼| 2020久久精品亚洲热综合一本| 国产精品成人久久久久久久| 久久久青草青青亚洲国产免观| 久久亚洲精品人成综合网| 久久99精品久久久久久动态图| 久久精品天天中文字幕人妻| 久久99精品久久只有精品| 国产99精品久久| 精品久久久久久无码中文野结衣 |