1. 程式人生 > >7-10 公路村村通

7-10 公路村村通

7-10 公路村村通 (30 分)

現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。

輸入格式:

輸入資料包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3N);隨後的M行對應M條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見,城鎮從1到N編號。

輸出格式:

輸出村村通需要的最低成本。如果輸入資料不足以保證暢通,則輸出−1,表示需要建設更多公路。

輸入樣例:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

輸出樣例:

12

思路:該題為典型的最小生成樹問題,但是 有個測試點一直過不去,翻看對應的習題集,給出的資料是n為1000,m為3000。不過還是沒有找到錯誤的地方難受,希望哪位好心人幫忙看一下然後告知我多謝了。解題思路為,採用的演算法為克魯斯卡爾演算法,將邊按從小到大排序,然後每次選出最小的一條邊加入到圖中但是不能構成迴路,當邊數為頂點數減一時,則最小生成樹構造成功。兩個關鍵步驟:1.每次選出最小的一條邊可以採用快速排序演算法或者最小堆,我用的是快速排序。2.如何判斷兩個頂點是否連通,這裡採用並查集的方法。

程式碼如下:

/************************************************************************
*
* 檔名:8.1.1.cpp
*
* 檔案描述:
*
* 建立人:  fdk

* 時  間:  2018-10-05
*
* 版本號:1.0
*
* 修改記錄:有個測試點一直過不去,翻看對應的習題集,給出的資料是n為1000,m為3000
*            不過還是沒有找到錯誤的地方難受。
*
************************************************************************/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include<limits.h>
#define max 100
using namespace std;
struct edge
{
    int u;
    int v;
    int w;
};
struct edge e[3001];
int n, m;
int f[1001] = {0}, sum = 0, counts = 0;

void quickSort(int left, int right)
{
    int i, j;
    struct edge t;
    if (left > right)
    {
        return;
    }
    i = left;
    j = right;
    while (i != j)
    {
        while (e[j].w >= e[left].w && i < j)
        {
            j--;
        }
        while (e[i].w <= e[left].w && i < j)
        {
            i++;
        }
        if (i < j)
        {
            t = e[i];
            e[i] = e[j];
            e[j] = t;
        }
    }
    t = e[left];
    e[left] = e[i];
    e[i] = t;

    quickSort(left, i-1);
    quickSort(i+1, right);
    return;
}

int getf(int v)
{
    if (f[v] == v)
    {
        return v;
    }
    else
    {
        f[v] = getf(f[v]);
        return f[v];
    }
}

int merge(int v, int u)
{
    int t1, t2;
    t1 = getf(v);
    t2 = getf(u);
    if (t1 != t2)
    {
        f[t2] = t1;
        return 1;
    }
    return 0;
}
int main()
{
    int i;

    cin >> n >> m;

    for (i = 1; i <= m; i++)
    {
        cin >> e[i].u >> e[i].v >> e[i].w;
    }
    quickSort(1, m);

    for (i = 1; i <= m; i++)
    {
        f[i] = i;
    }
    counts = n;
    for (i = 1; i <= m && counts > 1; i++)
    {
        if (merge(e[i].u, e[i].v))
        {
            sum += e[i].w;
            counts--;
        }
    }
    if (counts == 1)
    {
        cout << sum;
    }
    else
    {
        cout << "-1";
    }
    return 0;
}

相關推薦

7-10 公路村村 (30 分) Java版本

這就是一個最短路 ,排一下序然後並查集start和end就行了,要是用c++做估計我10分鐘就能做完,但是這個學期學java,那就用java吧,感覺好難啊 -- , 靜態 動態這一塊,上下文這一塊。。。。。 import java.util.Arrays; import j

7-10 公路村村 (30 分)(最小生成樹)+prim詳解

現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。 輸入格式: 輸入資料包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3N);隨後的M行對應M條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道

7-10 公路村村

7-10 公路村村通 (30 分) 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。 輸入格式: 輸入資料包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3N);隨後的M行對應M條道路,每行給出

5-10 公路村村 (30分)

包括 lose com 保留 ant 天下 統計數據 -1 value 5-10 公路村村通 (30分) 現有村落間道路的統計數據表中,列出了有可能建設成標準公路的若幹條道路的成本,求使每個村落都有公路連通所需要的最低成本。 輸入格式: 輸入數據包括城鎮數目正整數N

7-3 公路村村(最小生成樹K演算法)

7-3 公路村村通(30 分) 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。 輸入格式: 輸入資料包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3N);隨後的M行對應M條道路,每行給出3個正整數,分別是

PAT 7-14 公路村村

-s http pat htm namespace esp minus dfs push_back https://pintia.cn/problem-sets/1111189748004499456/problems/1111189831248850957 現有村

08-圖7 公路村村

生成 判斷 註意 -h using otto ext 輸入數據 包括 題目: 現有村落間道路的統計數據表中,列出了有可能建設成標準公路的若幹條道路的成本,求使每個村落都有公路連通所需要的最低成本。 輸入格式: 輸入數據包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3

《資料結構》08-圖7 公路村村

題目 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。 輸入格式: 輸入資料包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3N);隨後的M行對應M條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮

08-圖7 公路村村 (30分)

第一個程式碼:鄰接表+Prim 第二個程式碼:鄰接表+Kruskal #include <iostream> #include <vector> #include <queue> using namespace std; struct

中國大學MOOC-陳越、何欽銘-資料結構-2018秋——公路村村

我的中國大學MOOC-陳越、何欽銘-資料結構-2018秋程式碼倉:https://github.com/617076674/MOOC-DataStructure-2018-Autumn 題目描述: 知識點:最小生成樹 思路一:prim演算法 prim演算法的具體實現:

公路村村(PTA)

現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。 輸入格式: 輸入資料包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3N);

資料結構實驗之圖論六:村村公路__Prim

Problem Description 當前農村公路建設正如火如荼的展開,某鄉鎮政府決定實現村村通公路,工程師現有各個村落之間的原始道路統計資料表,表中列出了各村之間可以建設公路的若干條道路的成本,你的任務是根據給出的資料表,求使得每個村都有公路連通所需要的最低成本。 Input 連

資料結構實驗之圖論六:村村公路【Prim演算法】(SDUT 3362)

題解:選點,選最小權的邊,更新點權。可以手動自行找一遍怎麼找到這個最小的生成樹,隨便選一個點放入我們選的集合中,然後看和這個點相連的點中,與那個點相連的那條邊權值是最小的,選擇之後,把相連的這個點一起放入集合中,這樣的話集合中就多了一點,現在要找和這兩個點都相連的點中,那個邊的權最小,直到全部的

資料結構實驗之圖論六:村村公路——最小生成樹Kruskal演算法

Think: 1知識點:最小生成樹Kruskal演算法(並查集思想) 2反思:注意變數初始化 以下為Accepted程式碼 #include <bits/stdc++.h> using namespace std; struct

資料結構實驗之圖論六:村村公路 sdut oj (3362)

#include <bits/stdc++.h> #define INF 0x3f3f3f3f #define N 1100 using namespace std; int mp[N][N]; //鄰接矩陣儲存圖 int dis[N]; //標記陣列 int vis[N]; //用來記

MySQL 5.7.10最新版本號源碼安裝具體過程

ngs htm org ear xpl can 數據文件 private which 1,下載地址:安裝包下載地址:http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.10.tar.gz能夠wget下載,也能夠在p

關於PHP浮點數之 intval((0.1+0.7)*10) 為什麽是7

不能 col 判斷 不同 運行 sym 舉例 數位 右移 PHP是一種弱類型語言, 這樣的特性, 必然要求有無縫透明的隱式類型轉換, PHP內部使用zval來保存任意類型的數值, zval的結構如下(5.2為例): struct _zval_struct { /*

mac python2.7.10 升級到 3.6

配置 vim 移動 指向 安裝 當前 python3 root 軟連接 第一步:   下載當前最新版本 Python3.6,下載地址:https://www.python.org/downloads/ 第二步:   安裝下載好的包,安裝完成後的目錄如下:   /Libra

2017.7.10-2017.7.16

cnblogs except 異常 png bsp 方法 ava http 第四章 本周任務: 1 CS61B lecture1-6+lab1-2+homework1-2 2 瘋狂java講義 第一章-第四章 2017.7.10 打卡 √CS61B lecture

7/10

簡單 成了 學習 web.xml 培訓 功能 綁定 放松 servle 這兩天有點不舒服,每次認真學習一段時間就會很壓抑,需要放松一下。淘淘商城寫了有一周多,才完成一個模塊。想放松一下,就找了一個Java web項目學習了一下,一個簡單的網頁聊天。相當於yy的公屏模式。今天