国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

CCF201412-4 最優(yōu)灌溉(解法二)(100分)

2019-11-11 01:21:20
字體:
供稿:網(wǎng)友

問題鏈接:CCF201412試題。

問題描述

  雷雷承包了很多片麥田,為了灌溉這些麥田,雷雷在第一個麥田挖了一口很深的水井,所有的麥田都從這口井來引水灌溉。

  為了灌溉,雷雷需要建立一些水渠,以連接水井和麥田,雷雷也可以利用部分麥田作為“中轉(zhuǎn)站”,利用水渠連接不同的麥田,這樣只要一片麥田能被灌溉,則與其連接的麥田也能被灌溉。

  現(xiàn)在雷雷知道哪些麥田之間可以建設(shè)水渠和建設(shè)每個水渠所需要的費用(注意不是所有麥田之間都可以建立水渠)。請問灌溉所有麥田最少需要多少費用來修建水渠。

  輸入的第一行包含兩個正整數(shù)n, m,分別表示麥田的片數(shù)和雷雷可以建立的水渠的數(shù)量。麥田使用1, 2, 3, ……依次標(biāo)號。  接下來m行,每行包含三個整數(shù)ai, bi, ci,表示第ai片麥田與第bi片麥田之間可以建立一條水渠,所需要的費用為ci。  輸出一行,包含一個整數(shù),表示灌溉所有麥田所需要的最小費用。

問題分析:這是一個最小生成樹的為問題,解決的算法有Kruskal(克魯斯卡爾)算法和PRim(普里姆) 算法。

程序說明:本程序使用Kruskal算法實現(xiàn)。有關(guān)最小生成樹的問題,使用克魯斯卡爾算法更具有優(yōu)勢,只需要對所有的邊進行排序后處理一遍即可。程序中使用了并查集,用來判定加入一條邊后會不會產(chǎn)生循環(huán)。n個結(jié)點的圖,其最小生成樹應(yīng)該是n-1條邊,這個作為程序處理的結(jié)束條件。這個程序?qū)崿F(xiàn)Kruskal算法部分的邏輯和代碼都是否簡潔易懂。程序中,圖采用邊列表的方式存儲,按邊的權(quán)從小到大順序放在優(yōu)先隊列中,省去了排序。

提交后得100分的C++語言程序如下:

/* CCF201412-4 最優(yōu)灌溉 */#include <iostream>#include <vector>#include <queue>using namespace std;// 并查集類class UF {private:    vector<int> v;public:    UF(int n) {        for(int i=0; i<=n; i++)            v.push_back(i);    }    int Find(int x) {        for(;;) {            if(v[x] != x)                x = v[x];            else                return x;        }    }    bool Union(int x, int y) {        x = Find(x);        y = Find(y);        if(x == y)            return false;        else {            v[x] = y;            return true;        }    }};struct edge {    int src, dest, cost;    bool Operator < (const edge& n) const {        return cost > n.cost;    }};int main(){    priority_queue<edge> q;     // 優(yōu)先隊列,用于存儲邊列表    edge e;    // 輸入數(shù)據(jù)    int n, m;    cin >> n >> m;    for(int i=1; i<=m; i++) {        cin >> e.src >> e.dest >> e.cost;        q.push(e);    }    // Kruskal算法    UF uf(n);    int ans=0, count=0;    for(;;) {        e = q.top();        q.pop();        if(uf.Find(e.src) != uf.Find(e.dest)) {            uf.Union(e.src, e.dest);            ans += e.cost;            if(++count == n -1)                break;        }    }    // 輸出結(jié)果    cout << ans << endl;    return 0;}/*測試數(shù)據(jù)與結(jié)果兩組:6 101 2 31 3 11 4 62 3 52 5 33 4 53 5 63 6 44 6 25 6 6134 41 2 12 3 42 4 23 4 36*/


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 金堂县| 洪雅县| 蓬安县| 佛山市| 永善县| 邵东县| 固始县| 德令哈市| 抚顺市| 天峨县| 纳雍县| 康乐县| 中卫市| 宜兰县| 浮山县| 乐亭县| 胶南市| 潍坊市| 专栏| 贡嘎县| 荥阳市| 安庆市| 纳雍县| 临泽县| 新田县| 达尔| 惠安县| 乃东县| 钦州市| 遂宁市| 榆中县| 普安县| 柳河县| 寿阳县| 民勤县| 武邑县| 来凤县| 合阳县| 威宁| 桐城市| 阿拉善右旗|