管道鋪設施工的最佳方案選擇。n(n>10)個居民區(qū)之間需要鋪設煤氣管道淑蔚。假設任意兩個居民區(qū)之間都可以鋪設煤氣管道市殷,但代價不同。要求是先將任意兩個居民區(qū)之間鋪設煤氣管道的代價存入磁盤文件中刹衫。設計一...

解題思路

首先理解題意是求生成圖的最小生成圖醋寝,然后利用算法編寫程序,之后加上通過磁盤文件讀取數據带迟,最后考慮圖片形式輸出音羞。

算法實現

設G=(V,E)是一個無向連通網,令T=(U,TE)是G的最小生成樹仓犬。T的初始化狀態(tài)為U={ v0 }( v0 ∈V),TE={}嗅绰,重復執(zhí)行以下操作:在所有u∈U,v∈V–U的邊中一條代價最小的邊(u,v)并入集合TE,同時v并入U,直至U=V為止。此時TE中必有n-1條邊婶肩,則T就是一棵最小生成樹办陷。為了節(jié)省時間和空間,在邊集中選取最短邊時律歼,對于V–U中的每個頂點民镜,只保留從該頂點到U中某頂點的最短邊。
偽代碼描述如下:

  1. 初始化:U={ v0 },TE={}险毁;
  2. 重復執(zhí)行以下操作制圈,直至U=V:
    2.1 在E中尋找最短邊(u们童,v),且滿足u∈U,v∈V–U鲸鹦;
    2.2 U=U+{V}慧库;
    2.3 TE=TE+{(u,v)};
#include <iostream>
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
#define undefineNum 9999;//默認初始化數據的值
const int MaxNum = 50;//存儲圖數據的數組的最大值
int main(void)
{
goon:cout << "**********************************************\n";
    cout << "****      管道鋪設施工的最佳方案選擇      ****\n";
    cout << "****             Author: 潘悅             ****\n";
    cout << "****            Grade: 軟工1703           ****\n";
    cout << "****            Time: 2019/2/27           ****\n";
    cout << "**********************************************\n\n";
    int areaNum, lineNum;// 居民區(qū)個數, 管道條數
    int area1, area2;// 某管道的兩個居民區(qū)
    int price;//管道單位長度價格
    int distance, lower_distance = 0;//兩居民區(qū)間的距離,最短總路線長度
    int areaArrary[MaxNum][MaxNum];//將表示居民區(qū)的無向圖用鄰接矩陣表示
    int i, j;//變量
    FILE *f;
    char *arr;
    arr = "data1.txt";
    if((f = fopen(arr, "rb")) == NULL)
    {
        printf("文件無法打開\n");
        exit(0);
    }
    fscanf(f, "%d", &areaNum);
    fscanf(f, "%d", &lineNum);
    fscanf(f, "%d", &price);
    for (i = 0; i < areaNum; i++)
        for (j = 0; j < areaNum; j++)
            areaArrary[i][j] = undefineNum;//初始化圖的鄰接矩陣  
    cout << "--請輸入各管道連接的兩居民區(qū)及距離,如: 0 1 50\n";
    j = 1;//j表示第n條線路
    for (i = 0; i < lineNum; i++)
    {
        fscanf(f, "%d", &area1);
        fscanf(f, "%d", &area2);
        fscanf(f, "%d", &distance);
        areaArrary[area1][area2] = distance;
        areaArrary[area2][area1] = distance;
        j++;
    }
    fclose(f);
    int short_way[MaxNum];// 居民區(qū)i距離目前生成樹的點集中某個居民區(qū)的最短路程
    int near_area[MaxNum];// 目前生成樹的點集中能使距離下一居民區(qū)最近的居民區(qū)
    int min_way;// 目前生成樹的點集外頂點到目前生成樹的點集內頂點具有最短路徑的邊
    int temp_area;// 與目前生成樹的點集路程最短的居民區(qū)  
    for (i = 1; i < areaNum; i++)//將第一個頂點0加入最小生成樹的點集中
    {
        short_way[i] = areaArrary[0][i];
        near_area[i] = 0;
    }
    short_way[i] = 0;
    near_area[i] = 0;
    cout << "\n設計成功! 居民小區(qū)管道鋪設最優(yōu)方案設計如下:\n";
    for (i = 1; i < areaNum; i++)//第一個頂點0已加入生成樹,循環(huán)將剩下的n-1個頂點加入生成樹
    {
        min_way = undefineNum;      j = 1;      temp_area = 1;
        while (j < areaNum)
        {
            if (short_way[j] != 0 && short_way[j] < min_way)
            {
                min_way = short_way[j];
                temp_area = j;
            }
            j++;
        }
        cout << "居民區(qū)" << near_area[temp_area] << "----(" << min_way << "米)----居民區(qū)" << temp_area << endl;
        short_way[temp_area] = 0;
        lower_distance += min_way;//計算最短總長度
        for (j = 0; j < areaNum; j++)//更新候選最短路徑數組
            if (areaArrary[temp_area][j] < short_way[j])
            {
                short_way[j] = areaArrary[temp_area][j];
                near_area[j] = temp_area;
            }
    }
    cout << "最短總長度為: " << lower_distance << "米" << endl;
    cout << "最低總造價為: " << lower_distance * price << "元" << endl << endl;
    char choice;
    cout << "清空數據,重新輸入?    YES(y) or NO(n) : "; cin >> choice;
    if (choice == 'y')
    {
        system("cls");//清空屏幕,重新開始
        goto goon;
    }
    if (choice == 'n')
    {
        cout << "\n       恭喜你,成功退出!\n\n";
        exit(0);//退出程序  }
    }
}

mfc實現

圖1-1

圖1-2

運行結果

以data1.txt和data2.txt為例試運行。
文本文件中有居民區(qū)數量楷掉,管道數量景鼠,單位管道價格,各管道連接的兩居民區(qū)及長度甘磨。


圖2-1

圖2-2

圖2-3

圖2-4

結果正確。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末眯停,一起剝皮案震驚了整個濱河市济舆,隨后出現的幾起案子,更是在濱河造成了極大的恐慌莺债,老刑警劉巖滋觉,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異齐邦,居然都是意外死亡椎侠,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門侄旬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肺蔚,“玉大人,你說我怎么就攤上這事儡羔⌒颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵汰蜘,是天一觀的道長仇冯。 經常有香客問我,道長族操,這世上最難降的妖魔是什么苛坚? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮色难,結果婚禮上泼舱,老公的妹妹穿的比我還像新娘。我一直安慰自己枷莉,他們只是感情好娇昙,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笤妙,像睡著了一般冒掌。 火紅的嫁衣襯著肌膚如雪噪裕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天股毫,我揣著相機與錄音膳音,去河邊找鬼。 笑死铃诬,一個胖子當著我的面吹牛祭陷,可吹牛的內容都是我干的。 我是一名探鬼主播氧急,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颗胡,長吁一口氣:“原來是場噩夢啊……” “哼毫深!你這毒婦竟也來了吩坝?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤哑蔫,失蹤者是張志新(化名)和其女友劉穎钉寝,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體闸迷,經...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡嵌纲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了腥沽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逮走。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖今阳,靈堂內的尸體忽然破棺而出师溅,到底是詐尸還是另有隱情,我是刑警寧澤盾舌,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布墓臭,位于F島的核電站,受9級特大地震影響妖谴,放射性物質發(fā)生泄漏窿锉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一膝舅、第九天 我趴在偏房一處隱蔽的房頂上張望嗡载。 院中可真熱鬧,春花似錦仍稀、人聲如沸洼滚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽判沟。三九已至耿芹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挪哄,已是汗流浹背吧秕。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迹炼,地道東北人砸彬。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像斯入,于是被迫代替她去往敵國和親砂碉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內容