青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

CSU OJ - 1219: 建食堂 (所有結(jié)點間的最短路徑)

鏈接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1219

這個題
就是求出所有結(jié)點的距離之后,再找出某個結(jié)點,該結(jié)點離其它結(jié)點的最大距離是所有結(jié)點中是最小的...
解法1:深搜出所有結(jié)點間的距離,但是會超時,即使深搜的過程使用中記憶化搜索(就是用2維數(shù)組保存已經(jīng)搜出的答案,如果后面的搜索需要用到直接使用即可)...
解法2:Floyd算法,3重循環(huán)直接找出所有結(jié)點之間的最短距離
解法3:對每一個結(jié)點應(yīng)用一次迪杰斯特拉算法,找出所有結(jié)點與其它結(jié)點間的最短距離...

解法2:
#include <stdio.h>
#include <string.h>
#define MAX  (100 + 10)
#define INF (1000000 + 10)
int nN, nM;
int nDis[MAX][MAX];
void SearchAll()
{
    for (int k = 0; k < nN; ++k)
    {
        for (int i = 0; i < nN; ++i)
        {   
            for (int j = 0; j < nN; ++j)
            {
                if (nDis[i][k] + nDis[k][j] < nDis[i][j])
                {
                    nDis[i][j] = nDis[j][i] = nDis[i][k] + nDis[k][j];
                }
            }
        }
    }
}
int main()
{
    while (scanf("%d%d", &nN, &nM) == 2)
    {
        for (int i = 0; i < nN; ++i)
        {
            for (int j = 0; j < nN; ++j)
            {
                if (i == j)
                {
                    nDis[i][j] = 0;
                }
                else
                {
                    nDis[i][j] = INF;
                }
            }
        }
        while (nM--)
        {
            int nX, nY, nK;
            scanf("%d%d%d", &nX, &nY, &nK);
            nDis[nX][nY] = nDis[nY][nX] = nK;
        }
        SearchAll();
        bool bOk = false;
        int nMin = 1 << 30;
        
        for (int i = 0; i < nN; ++i)
        {
            int nTemp = 0;
            int j = 0;
            for ( ; j < nN; ++j)
            {
                if (i == j) continue;
                if (nDis[i][j] == INF)
                {
                    break;
                }
                else
                {
                    if (nDis[i][j] > nTemp)
                    {
                        nTemp = nDis[i][j];
                    }
                }
            }
            if (j == nN)
            {
                bOk = true;
                if (nTemp < nMin)
                {
                    nMin = nTemp;
                }
            }
        }
        
        if (bOk)
        {
            printf("%d\n", nMin);
        }
        else
        {
            printf("Can not\n");
        }
    }
    return 0;
}

關(guān)于Floyd算法,可以這樣理解...比如剛開始只取2個結(jié)點i,j,它們的距離一定是dis(i,j),但是還有其它結(jié)點,需要把其它結(jié)點也慢慢加進來,所以最外層關(guān)于k的循環(huán)意思就是從0至nN-1,把所有其它結(jié)點加進來,比如加入0號結(jié)點后,距離dis(i,0)+dis(0,j)可能會比dis(i,j)小,如果是這樣就更新dis(i,j),然后后面加入1號結(jié)點的時候,實際上是在已經(jīng)加入0號結(jié)點的基礎(chǔ)上進行的處理了,效果變成dis(i,0,1,j),可能是最小的,而且中間的0,1也可能是不存在的,當然是在dis(i,j)原本就是最小的情況下...
這個算法可以用下面這個圖片描述...


解法3:
#include <stdio.h>
#include <string.h>
#define MAX  (100 + 10)
#define INF (1000000 + 10)
int nN, nM;
int nDis[MAX][MAX];
void Search(int nSource)
{
    bool bVisit[MAX];
    memset(bVisit, false, sizeof(bVisit));
    bVisit[nSource] = true;
    for (int i = 0; i < nN - 1; ++i)
    {
        int nMin = INF;
        int nMinPos = 0;
        for (int j = 0; j < nN; ++j)
        {
            if (!bVisit[j] && nDis[nSource][j] < nMin)
            {
                nMin = nDis[nSource][j];
                nMinPos = j;
            }
        }
        if (bVisit[nMinPos] == false)
        {
            bVisit[nMinPos] = true;
            for (int j = 0; j < nN; ++j)
            {
                if (nDis[nSource][nMinPos] + nDis[nMinPos][j] < nDis[nSource][j])
                {
                    nDis[nSource][j] = nDis[nSource][nMinPos] + nDis[nMinPos][j];
                }
            }
        }
    }
}
void SearchAll()
{
    for (int k = 0; k < nN; ++k)
    {
        Search(k);
    }
}
int main()
{
    while (scanf("%d%d", &nN, &nM) == 2)
    {
        for (int i = 0; i < nN; ++i)
        {
            for (int j = 0; j < nN; ++j)
            {
                if (i == j)
                {
                    nDis[i][j] = 0;
                }
                else
                {
                    nDis[i][j] = INF;
                }
            }
        }
        while (nM--)
        {
            int nX, nY, nK;
            scanf("%d%d%d", &nX, &nY, &nK);
            nDis[nX][nY] = nDis[nY][nX] = nK;
        }
        SearchAll();
        bool bOk = false;
        int nMin = 1 << 30;
        for (int i = 0; i < nN; ++i)
        {
            int nTemp = 0;
            int j = 0;
            for ( ; j < nN; ++j)
            {
                if (i == j) continue;
                if (nDis[i][j] == INF)
                {
                    break;
                }
                else
                {
                    if (nDis[i][j] > nTemp)
                    {
                        nTemp = nDis[i][j];
                    }
                }
            }
            if (j == nN)
            {
                bOk = true;
                if (nTemp < nMin)
                {
                    nMin = nTemp;
                }
            }
        }
        if (bOk)
        {
            printf("%d\n", nMin);
        }
        else
        {
            printf("Can not\n");
        }
    }
    return 0;
}
迪杰斯特拉算法的核心思想是維護一個源點頂點集合,任何最短路徑一定是從這個頂點集合發(fā)出的...
初始化時,這個集合就是源點...
我們從該其它結(jié)點中選出一個結(jié)點,該結(jié)點到源點的距離最小...
顯然,這個距離就是源點到該結(jié)點的最短距離了,我們已經(jīng)找到了答案的一部分了...然后,我們就把該結(jié)點加入前面所說的頂點集合...
現(xiàn)在頂點集合更新了,我們必須得更新距離了...由于新加入的結(jié)點可能發(fā)出邊使得原來源點到某些結(jié)點的距離更小,也就是我們的源點變大了,邊也變多了,所以我們的最短距離集合的值也必須變化了...
該算法一直循環(huán)nN-1次,直至所有的點都加入源點頂點集合...

posted on 2011-12-04 22:20 yx 閱讀(1256) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告 、圖論

<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

導(dǎo)航

統(tǒng)計

公告

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

me

好友

同學(xué)

網(wǎng)友

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜精品久久久久影视| 久久久999国产| 国产色爱av资源综合区| 欧美偷拍一区二区| 国产精品久久久久久久久久ktv| 欧美少妇一区二区| 国产精品入口尤物| 国外成人在线视频网站| 亚洲国产精品久久久久久女王| 亚洲国产精品久久久久婷婷884| 亚洲电影免费观看高清完整版在线观看| 在线欧美亚洲| 亚洲一级影院| 欧美插天视频在线播放| 日韩视频一区二区在线观看 | 国产毛片久久| 国产一区二区在线观看免费播放| 在线精品在线| 亚洲深夜福利视频| 久久久噜噜噜久久人人看| 欧美韩日视频| 亚洲已满18点击进入久久| 久久久亚洲国产天美传媒修理工| 欧美全黄视频| 好看的av在线不卡观看| 中国成人亚色综合网站| 久久综合久色欧美综合狠狠| 亚洲人成绝费网站色www| 亚洲视频电影图片偷拍一区| 久久精品国语| 国产精品一卡二| 日韩写真在线| 蜜臀av一级做a爰片久久| 亚洲午夜精品视频| 欧美激情一区二区三区全黄| 国内精品一区二区三区| 亚洲免费人成在线视频观看| 欧美成人精品一区二区三区| 午夜精品在线看| 欧美国产一区二区三区激情无套| 久久偷看各类wc女厕嘘嘘偷窃| 欧美激情亚洲另类| 亚洲免费电影在线| 久久久久国产成人精品亚洲午夜| 欧美三级视频在线播放| 亚洲第一精品影视| 久久成年人视频| 99视频精品免费观看| 美国十次成人| 亚洲高清在线精品| 老牛国产精品一区的观看方式| 亚洲一区二区三区在线观看视频| 女人天堂亚洲aⅴ在线观看| 国产一区二区丝袜高跟鞋图片| 亚洲欧美日韩中文在线制服| 99在线热播精品免费| 欧美理论电影在线观看| 亚洲黄网站黄| 欧美高清视频一区二区三区在线观看 | 欧美一区二区在线观看| 国产精品热久久久久夜色精品三区| 亚洲裸体在线观看| 亚洲国产视频一区| 欧美国产综合视频| 亚洲精品永久免费| 亚洲毛片在线观看| 欧美午夜不卡视频| 亚洲欧美日韩天堂| 欧美一区二区三区免费观看| 国产亚洲午夜高清国产拍精品| 久久精品日韩欧美| 久久久久一区二区| 亚洲开发第一视频在线播放| 亚洲精品孕妇| 国产精品久线观看视频| 久久精品亚洲一区二区| 久久国产精品久久久久久电车| 狠狠v欧美v日韩v亚洲ⅴ| 女女同性精品视频| 欧美伦理在线观看| 欧美影院久久久| 久久精品30| 亚洲精品日本| 亚洲先锋成人| 在线国产精品一区| 亚洲乱码一区二区| 国产精品视频在线观看| 久久久噜噜噜久久中文字免| 美女久久一区| 亚洲一区二区三区777| 欧美一级在线亚洲天堂| 亚洲精品久久久久久久久久久久久| 亚洲精品视频在线观看免费| 国产伦精品一区二区三区照片91| 蜜桃av一区二区| 欧美日韩在线三级| 亚洲一区日韩在线| 一区二区在线观看视频| 亚洲欧美久久久| 久久黄色级2电影| 99国内精品久久久久久久软件| 亚洲特级片在线| 激情欧美亚洲| 亚洲视频久久| 亚洲激情一区二区| 亚洲新中文字幕| 91久久中文| 午夜精品999| 一区二区欧美国产| 久久九九热re6这里有精品| 国产精品99久久久久久久久久久久 | 一二三区精品福利视频| 午夜伦欧美伦电影理论片| 亚洲黄色影片| 久久精品观看| 欧美一级视频精品观看| 欧美日韩国产二区| 亚洲高清不卡在线| 精品91久久久久| 午夜精品婷婷| 欧美中文字幕在线视频| 国产精品国产三级国产专播精品人| 欧美高清在线一区二区| 狠狠色综合播放一区二区| 亚洲女女女同性video| 亚洲无限av看| 欧美少妇一区二区| 9l国产精品久久久久麻豆| 亚洲精品色图| 欧美va亚洲va香蕉在线| 老巨人导航500精品| 好看的av在线不卡观看| 欧美中文在线免费| 久久国产主播精品| 国产视频欧美视频| 欧美一区免费视频| 久久免费一区| 激情久久中文字幕| 久久久久欧美精品| 欧美黄色大片网站| 亚洲人成网站影音先锋播放| 久热精品视频在线| 亚洲福利av| 99热这里只有成人精品国产| 欧美激情欧美狂野欧美精品| 亚洲人成欧美中文字幕| 亚洲社区在线观看| 国产欧美日韩精品一区 | 欧美日本中文字幕| 亚洲久久成人| 亚洲欧美在线x视频| 国产精品日韩一区| 久久精品导航| 最新亚洲一区| 亚洲综合色丁香婷婷六月图片| 国产精品美女久久| 欧美在线观看日本一区| 免费中文字幕日韩欧美| 亚洲全部视频| 欧美亚洲免费| 欧美亚洲视频在线观看| 亚洲先锋成人| 国产精品久久久久久妇女6080 | 亚洲日本一区二区| 欧美日韩成人一区二区三区| 一卡二卡3卡四卡高清精品视频| 亚洲欧美成人精品| 国产午夜精品一区二区三区欧美| 久久久久久久性| 99热这里只有成人精品国产| 久久精品色图| 亚洲视频播放| 一区二区在线观看视频| 欧美区亚洲区| 久久美女性网| 亚洲一区三区在线观看| 欧美高清在线视频| 久久爱另类一区二区小说| 亚洲免费成人| 国内精品模特av私拍在线观看| 欧美高清在线观看| 性欧美暴力猛交另类hd| 亚洲欧洲综合| 久久综合给合| 欧美在线999| 99香蕉国产精品偷在线观看| 国产伊人精品| 国产精品欧美久久久久无广告| 欧美成在线视频| 久久精品国产一区二区电影| 一本色道久久综合亚洲精品不卡| 免费一区二区三区| 久久精品人人做人人综合| 亚洲综合国产| 亚洲网站在线| 亚洲视频在线观看| 亚洲美女av网站| 伊人久久久大香线蕉综合直播| 国产女主播一区| 国产伦精品一区二区三区免费迷 |