1. 程式人生 > >資料結構實驗之圖論六:村村通公路 sdut oj (3362)

資料結構實驗之圖論六:村村通公路 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];   //用來記錄當前生成樹到每個節點的距離
int sum, n, m;//n代表節點數  sum儲存生成樹的權值總和

void prim()
{
    sum=0;    //最小生成樹的權值總和初始化為0
    int mm;
    memset(vis, false, sizeof(vis)); //初始化節點均沒有被訪問
    for(int i = 1; i <= n; i++)
    {
        dis[i] = mp[1][i];  //我們從0號節點開始生成樹
    }
    vis[1] = true;    //生成樹的根(起點)標記訪問
    int pos;          //用來記錄每一次迴圈找到的節點的編號
    int d = 0;        //標記變數
    for(int i = 1; i < n; i++)    //要生成n-1條邊,所以迴圈n-1次
    {
        mm = INF;
        for(int j = 1; j <= n; j++)  //對dis陣列進行遍歷,找到值最小的
        {
            if(!vis[j] && dis[j] < mm)
            {
                mm = dis[j];
                pos = j;
            }
        }
        if(mm == INF)     //如果在此跳出迴圈,表示有城市之間不能連通
        {
            d = 1;
            break;
        }
        sum += mm;        //加上找到的最小權值
        vis[pos] = true;  //標記找到的該節點被訪問
        for(int j = 1; j <= n; j++)   //更新dis陣列
        {
            if(!vis[j] && dis[j] > mp[pos][j])
            {
                dis[j] = mp[pos][j];  //如果該點還沒有被訪問過,
                                      //更新生成樹到該點的距離;
            }
        }
    }
    if(d == 0)
    printf("%d\n", sum);      //n-1次迴圈完畢後輸出權值總和
    else
    printf("-1\n");
}

int main()
{
    while(cin >> n >> m)
    {
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)  //對mp陣列初始化
            {
                if(i == j)
                    mp[i][j] = 0;
                else
                    mp[i][j] = INF;
            }
        }
        while(m--)
        {
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            if(mp[a][b] > c)        //如果存在重邊,取最小值
                mp[a][b] = mp[b][a] = c;
        }
        prim();              //執行普利姆演算法
    }
    return 0;
}


相關推薦

資料結構實驗村村公路 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]; //用來記

資料結構實驗村村公路__Prim

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

資料結構實驗村村公路【Prim演算法】(SDUT 3362

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

資料結構實驗村村公路——最小生成樹Kruskal演算法

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

資料結構實驗判斷可達性(SDUT 2138)(簡單DFS)

#include <bits/stdc++.h> using namespace std; int gra[1002][1005]; int vis[1002]; int n,m; void dfs(int x) { vis[x] = 1; for(int i = 1

資料結構實驗的深度遍歷(SDUT 2107)(簡單DFS)

題解:圖的深度遍歷就是順著一個最初的結點開始,把與它相鄰的結點都找到,也就是一直往下搜尋直到盡頭,然後在順次找其他的結點。 #include <bits/stdc++.h> using namespace std; int gra[200][200]; //儲存圖的大小 int

SDUT-3361_資料結構實驗迷宮探索

資料結構實驗之圖論四:迷宮探索 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 有一個地下迷宮,它的通道都是直的,而通道所有交叉點(包括通道的端點)上都有一盞燈和一個開關;請問如何從某個起點開始在迷宮中點亮所有的燈並回到起點

資料結構實驗迷宮探索(判斷連通

Problem Description 有一個地下迷宮,它的通道都是直的,而通道所有交叉點(包括通道的端點)上都有一盞燈和一個開關;請問如何從某個起點開始在迷宮中點亮所有的燈並回到起點? Input 連續T組資料輸入,每組資料第一行給出三個正整數,分別表示地下迷宮的結點數N(1 &l

資料結構實驗判斷給定是否存在合法拓撲序列__BFS

Problem Description 給定一個有向圖,判斷該有向圖是否存在一個合法的拓撲序列。 Input 輸入包含多組,每組格式如下。 第一行包含兩個整數n,m,分別代表該有向圖的頂點數和邊數。(n<=10) 後面m行每行兩個整數a b,表示從a到b有一條有向邊。 Ou

資料結構實驗最小生成樹__Prim

Problem Description 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。 Input 輸入包含多組資料,格式如下。 第一行包括兩個整數n m,

資料結構實驗歐拉回路__DFS

Problem Description 在哥尼斯堡的一個公園裡,有七座橋將普雷格爾河中兩個島及島與河岸連線起來。 能否走過這樣的七座橋,並且每橋只走一次?瑞士數學家尤拉最終解決了這個問題並由此創立了拓撲學。尤拉通過對七橋問題的研究,不僅圓滿地回答了哥尼斯堡七橋問題,並證明了更為廣泛的有

資料結構實驗驢友計劃__Dijkstra

Problem Description 做為一個資深驢友,小新有一張珍藏的自駕遊線路圖,圖上詳細的標註了全國各個城市之間的高速公路距離和公路收費情況,現在請你編寫一個程式,找出一條出發地到目的地之間的最短路徑,如果有多條路徑最短,則輸出過路費最少的一條路徑。 Input 連續T組資料

資料結構實驗迷宮探索__DFS

Problem Description 有一個地下迷宮,它的通道都是直的,而通道所有交叉點(包括通道的端點)上都有一盞燈和一個開關;請問如何從某個起點開始在迷宮中點亮所有的燈並回到起點? Input 連續T組資料輸入,每組資料第一行給出三個正整數,分別表示地下迷宮的結點數N(1 &l

資料結構實驗判斷可達性__DFS

Problem Description 在古老的魔獸傳說中,有兩個軍團,一個叫天災,一個叫近衛。在他們所在的地域,有n個隘口,編號為1…n,某些隘口之間是有通道連線的。其中近衛軍團在1號隘口,天災軍團在n號隘口。某一天,天災軍團的領袖巫妖王決定派兵攻打近衛軍團,天災軍團的部隊如此龐大,甚

資料結構實驗的深度遍歷__DFS

Problem Description 請定一個無向圖,頂點編號從0到n-1,用深度優先搜尋(DFS),遍歷並輸出。遍歷時,先遍歷節點編號小的。 Input 輸入第一行為整數n(0 < n < 100),表示資料的組數。 對於每組資料,第一行是兩個整數k,m(0 < k

資料結構實驗基於鄰接矩陣的廣度優先搜尋遍歷__BFS

Problem Description 給定一個無向連通圖,頂點編號從0到n-1,用廣度優先搜尋(BFS)遍歷,輸出從某個頂點出發的遍歷序列。(同一個結點的同層鄰接點,節點編號小的優先遍歷) Input 輸入第一行為整數n(0< n <100),表示資料的組數。 對於每組

資料結構實驗判斷給定是否存在合法拓撲序列(SDUT 2140)

分析:BFS判斷是否有環。  #include<bits/stdc++.h> using namespace std; typedef long long ll; int gra[200][200]; int vis[100]; void bfs(int n) {

資料結構實驗最小生成樹 (SDUT 2144)

#include<bits/stdc++.h> using namespace std; typedef long long ll; struct node { int s, e; int w; }s[100005]; int c[105]; bool cmp(str

資料結構實驗驢友計劃【迪傑斯特拉演算法】(SDUT 3363)

分析:可以求簡單的任意兩點間最短距離的稍微變形,一個板子題。  #include <iostream> #include <bits/stdc++.h> using namespace std; int inf = 0x3fffff; int gra[100

SDUT- 2138 資料結構實驗判斷可達性

#include <stdio.h> #include <string.h> #include <stdlib.h> int a[1005][1005]; int vis[1005]; int qu[100005], front, tail