ACM第四站————最小生成樹(普里姆算法)

對于一個帶權的無向連通圖,其每個生成樹所有邊上的權值之和可能不同,我們把所有邊上權值之和最小的生成樹稱為圖的最小生成樹

普里姆算法是以其中某一頂點為起點逐步尋找各個頂點上最小權值的邊來構建最小生成樹。

其中運用到了回溯,貪心的思想。

----------2018年5月24日補:

  #begin

    根據定義我們可知,求一個圖的最小生成樹的時候,一定會將所有的點都連接起來,也就是說,我們從任何一個點出發都可以得到這個圖的最小生成樹,那么我這里暫定從0出發,尋找到和0相連的點中最小的權值,作為連接0這一個點的邊(如果有相同的最小權值,則視要求處理),將0這一個點設置為不可訪問,同時保存此時的連接點,將求到的這一個點做和0一樣相同的處理...處理出n個點就可以求得這個圖的最小生成樹了(如果不能處理出n個點,那么此圖的最小生成樹也就不存在)。

  #end

廢話少說,直接上題吧!這些東西多練就好!

?

一、最小生成樹:

題目描述
求一個連通無向圖的最小生成樹的代價(圖邊權值為正整數)。
輸入
第 一行是一個整數N(1<=N<=20),表示有多少個圖需要計算。以下有N個圖,第i圖的第一行是一個整數M(1<=M& lt;=50),表示圖的頂點數,第i圖的第2行至1+M行為一個M*M的二維矩陣,其元素ai,j表示圖的i頂點和j頂點的連接情況,如果 ai,j=0,表示i頂點和j頂點不相連;如果ai,j>0,表示i頂點和j頂點的連接權值。
輸出
每個用例,用一行輸出對應圖的最小生成樹的代價。
樣例輸入
1
6
0 6 1 5 0 0
6 0 5 0 3 0
1 5 0 5 6 4
5 0 5 0 0 2
0 3 6 0 0 6
0 0 4 2 6 0
樣例輸出

15

//Asimple
#include <stdio.h>
#include <iostream>
#include <string.h>using namespace std;
#define INF 0xffffff
const int maxn = 55;
int G[maxn][maxn];//建圖
int T, n;int prim()
{int Min, sum = 0;int adv[maxn]; //保存定點下標int lowc[maxn]; //保存權值adv[0] = lowc[0] = 0 ;//初始化for(int i=1; i<n; i++){lowc[i] = G[0][i];//先放入 第0行 的所有權值adv[i] = 0 ;}//構建過程for(int i=1; i<n; i++){Min = INF ;int j = 1 ;int k = 0 ;while( j < n ){if( lowc[j]!=0 && lowc[j]<Min){Min = lowc[j] ;k = j ;}j ++ ;}sum += G[adv[k]][k] ;//計算最小權值//printf("%d,%d",adv[k],k);//打印節點lowc[k] = 0 ;//逐行遍歷接下來的k個頂點for(int l=1; l<n; l++){if( lowc[l]!=0 && G[k][l] < lowc[l] ){lowc[l] = G[k][l] ;adv[l] = k ;}}}return sum ;
}int main()
{cin >> T ;while( T -- ){cin >> n ;for(int i=0; i<n; i++)for(int j=0; j<n; j++){cin >> G[i][j];if( G[i][j] == 0 && i!=j )G[i][j] = INF ;}cout << prim() << endl ;}return 0;
}

?二、判斷最小生成樹是否唯一

題目描述

給出一個連通無向圖,請判斷其最小生成樹是否是唯一的。

定義1(生成樹):給出一個連通無向圖G=(V,E),G的一顆生成樹被標記為T=(V,E),則具有以下性質:

1)V'=V;?

2)T是連通無回路的。

定義2(最小生成樹):給出一個邊帶權的連通無向圖G=(V,E),G 的最小生成樹T=(v,E)是具有最小總耗費的生成樹。T的總耗費表示E' 中所有邊的權值的和。

輸入

第 一行給出一個整數t(1<=t<=20),表示測試用例數,每個測試用例表示一個圖,測試用例的第一行給出兩個整數n,m(1<=n<=100),分別表 示頂點和邊的數目,后面的m行每行是一個三元組(xi,yi,wi),表示xi和yi通過權值為wi的邊相連。任意兩個節點間至多只有一條邊相連。

輸出

對于每個測試用例,如果MST是唯一的,輸出其總耗費;否則輸出字符串'Not Unique!'.?

樣例輸入
2
3 3
1 2 1
2 3 2
3 1 3
4 4
1 2 2
2 3 2
3 4 2
4 1 2
樣例輸出

3

Not Unique!

?

#include <stdio.h>
#include <iostream>
#include <string.h>using namespace std;
#define INF 0xffffff
const int maxn = 55;
int G[maxn][maxn];//建圖
int T, n, m, x, y, num;void prim()
{int Min, sum = 0;int adv[maxn]; //保存定點下標int lowc[maxn]; //保存權值bool flag = false ;adv[0] = lowc[0] = 0 ;//初始化for(int i=1; i<n; i++){lowc[i] = G[0][i];//先放入 第0行 的所有權值adv[i] = 0 ;}//構建過程for(int i=1; i<n; i++){Min = INF ;int j = 1 ;int k = 0 ;while( j < n ){if( lowc[j]!=0 && lowc[j]<=Min){if( lowc[j] == Min ) flag = true ;Min = lowc[j] ;k = j ;}j ++ ;}sum += G[adv[k]][k] ;//計算最小權值lowc[k] = 0 ;//逐行遍歷接下來的k個頂點for(int l=1; l<n; l++){if( lowc[l]!=0 && G[k][l] < lowc[l] ){lowc[l] = G[k][l] ;adv[l] = k ;}}}if( flag ) cout << "Not Unique!" << endl ;else cout << sum << endl ;
}int main()
{cin >> T ;while( T -- ){cin >> n >> m ;for(int i=0; i<n; i++)for(int j=0; j<n; j++){if( i == j ) G[i][j] = 0 ;else G[i][j] = INF ;}for(int i=0; i<m; i++){cin >> x >> y >> num ;G[x-1][y-1] = num ;G[y-1][x-1] = num ;}prim();}return 0;
}

2018年4月1日更正:

上面的代碼過不了? POJ 1679。謝謝指點~~? ?今天更改了下自己的程序。

18390068Asimple1679Accepted312K16MSC++1483B2018-04-01 20:08:48
//Asimple
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
#define INF 0xffffff
typedef long long ll ;
const int maxn = 100+5;
int n, T, num, cnt, x, y, t, m, w;
int Map[maxn][maxn];void prim() {int lowc[maxn];for(int i=1; i<=n; i++) lowc[i] = Map[1][i];int sum = 0;bool flag = false;for(int l=1; l<n; l++) {int Min = INF;int k = 0;for(int j=2; j<=n; j++) {if( lowc[j]!=0 && Min > lowc[j] ) {k = j;Min = lowc[j];}}if( Min == INF ) break; sum += Min;int cnt = 0;for(int i=1; i<=n; i++)if( Map[k][i] == lowc[k] )cnt ++;if( cnt > 1 ) {flag = true;break;}lowc[k] = 0;for(int i=2; i<=n; i++) {if( lowc[i] > Map[k][i] ) {lowc[i] = Map[k][i];}}}if( flag ) cout << "Not Unique!" << endl;else cout << sum << endl;
}void input() {ios_base::sync_with_stdio(false);cin >> T;while( T -- ) {cin >> n >> m;for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) {Map[i][j] = i==j?0:INF;}}while( m -- ) {cin >> x >> y >> w;Map[x][y] = min(Map[x][y], w);Map[y][x] = Map[x][y];}prim();} 
}int main() {input();return 0;
}

?

轉載于:https://www.cnblogs.com/Asimple/p/5551129.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372894.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372894.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372894.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用jenkins的api來完成相關工作流程的自動化

[本文出自天外歸云的博客園] 背景 1. 實際工作中涉及到安卓客戶端方面的測試&#xff0c;外推或運營部門經常會有很多的渠道&#xff0c;而每個渠道都對應著一個app的下載包&#xff0c;這些渠道都記錄在安卓項目下的一個渠道列表文件中。外推或運營部門經常會有新的渠道產生&a…

擁有成本分析:Oracle WebLogic Server與JBoss

Crimson Consulting Group 撰寫的非常有趣的白皮書 &#xff0c;比較了Weblogic和JBoss之間的擁有成本 。 盡管JBoss是免費的&#xff0c;但該白皮書卻嚴肅地宣稱&#xff0c;從長遠來看&#xff0c;Weblogic更便宜。 盡管此研究是由Oracle贊助的&#xff0c;但它看起來非常嚴肅…

mysql limit 分頁 0_Mysql分頁之limit用法與limit優化

Mysql limit分頁語句用法與Oracle和MS SqlServer相比&#xff0c;mysql的分頁方法簡單的讓人想哭。--語法&#xff1a;SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset--舉例&#xff1a;select * from table limit 5; --返回前5行select * from table limit 0…

與硒的集成測試

總覽 我已經使用了一段時間&#xff0c;遇到了一些似乎可以使生活更輕松的事情。 我以為可以將其作為教程分享&#xff0c;所以我將向您介紹這些部分&#xff1a; 使用Maven設置Web項目&#xff0c;配置Selenium以在CI上作為集成測試運行 尋找使用“頁面對象”為網站中的頁面…

linux每天一小步---sed命令詳解

1 命令功能 sed是一個相當強大的文件處理編輯工具&#xff0c;sed用來替換&#xff0c;刪除&#xff0c;更新文件中的內容。sed以文本行為單位進行處理&#xff0c;一次處理一行內容。首先sed吧當前處理的行存儲在臨時的緩沖區中&#xff08;稱為模式空間pattern space&#xf…

mysql trace工具_100% 展示 MySQL 語句執行的神器-Optimizer Trace

在上一篇文章《用Explain 命令分析 MySQL 的 SQL 執行》中&#xff0c;我們講解了 Explain 命令的詳細使用。但是它只能展示 SQL 語句的執行計劃&#xff0c;無法展示為什么一些其他的執行計劃未被選擇&#xff0c;比如說明明有索引&#xff0c;但是為什么查詢時未使用索引等。…

MOXy作為您的JAX-RS JSON提供程序–服務器端

在以前的系列文章中&#xff0c;我介紹了如何利用EclipseLink JAXB&#xff08;MOXy&#xff09;創建RESTful數據訪問服務。 在本文中&#xff0c;我將介紹在服務器端利用MOXy的新JSON綁定添加對基于JAXB映射的JSON消息的支持有多么容易。 MOXy作為您的JAX-RS JSON提供程序–服…

006_過濾器

過濾器 過濾器&#xff08;Filter&#xff09;把附加邏輯注入到MVC框的請求處理&#xff0c;實現了交叉關注。所謂交叉關注&#xff08;Cross-Cutting Concerns&#xff09;&#xff0c;是指可以用于整個應用程序&#xff0c;而又不適合放置在某個局部位置的功能&#xff0c;否…

Android_項目文件結構目錄分析

android項目文件結構目錄分析 在此我們新建了一個helloworld的項目&#xff0c;先看一些目錄結構&#xff1a; 這么多的文件夾和文件中&#xff0c;我們重點關注是res目錄、src目錄、AndroidManifest.xml文件&#xff1a; 一、res目錄主要是用來存放android項目的各種資源文件&…

實體 聯系 模型mysql_數據庫系統概念讀書筆記――實體-聯系模型_MySQL

bitsCN.com數據庫系統概念讀書筆記——實體-聯系模型前言為了重新回顧我寫的消息系統架構&#xff0c;我需要重新讀一下數據庫系統概念的前三章&#xff0c;這里簡單的做一個筆記&#xff0c;方便自己回顧基本概念實體-聯系(E-R)數據模型基于對現實世界的這樣一種認識&#xff…

使用Twitter Bootstrap,WebSocket,Akka和OpenLayers玩(2.0)

原始帖子可以在ekito網站上找到。 對于我們的一位客戶&#xff0c;我們需要顯示一張具有實時更新的車輛位置的地圖。 因此&#xff0c;我開始使用Play制作原型&#xff01; 框架及其最新發布的版本2.0&#xff0c;使用Java API。 我從Play的網絡聊天室開始&#xff01; 2.0個樣…

同步時間

同步時間 [rootlocalhost 03]# ntpdate 0.centos.pool.ntp.org 轉載于:https://www.cnblogs.com/cglWorkBook/p/5556920.html

mysql 5.6.23免安裝_mysql5.6.23免安裝配置

1.官網下載&#xff0c;并解壓2.環境變量&#xff0c;path下&#xff0c;追加mysql的bin路徑D:\Program Files\mysql\bin;3.mysql目錄下的my-default.ini重命名為my.ini&#xff0c;并添加下面的代碼basedirD:/Program Files/mysql #mysql路徑datadirD:/Program Files/mysql/d…

在Intellij IDEA中運行Vaadin應用

在本文中&#xff0c;我將向您展示如何使用Intellij IDEA運行vaadin應用程序。 Vaadin提供了一些用于Eclipse和Netbeans的插件。 但是對于Intellij IDEA來說&#xff0c;還沒有插件。 但是部署vaadin應用程序比其他兩個IDE容易。 這是您要遵循的步驟。 1.首先創建一個新項目&am…

mysql主從數據庫

Mysql主從配置&#xff0c;實現讀寫分離 大型網站為了軟解大量的并發訪問&#xff0c;除了在網站實現分布式負載均衡&#xff0c;遠遠不夠。到了數據業務層、數據訪問層&#xff0c;如果還是傳統的數據結構&#xff0c;或者只是單單靠一臺服務器扛&#xff0c;如此多的數據庫連…

安裝openstack時遇到的錯誤

學習opensatck的第一步是安裝DevStack來進行本機操作 1. 下面命令沒有權限&#xff0c;解決辦法&#xff1a;切換到root用戶下執行sudo -s echo "stack ALL(ALL) NOPASSWD: ALL" >> /etc/sudoers2. 執行下面命令提示沒有git&#xff0c;解決辦法&#xff1a;su…

Java EE 6示例– Galleria –第3部分

關于Galleria示例的先前文章&#xff08; 第1 部分 | 第2部分 | 第3部分 | 第4部分 &#xff09;指導您完成基礎知識以及對GlassFish和WebLogic的初始部署。 從今天開始&#xff0c;我嘗試在其中添加一些企業級功能&#xff0c;因為我發現他們在自己的項目中提出了很多要求。 我…

在 Windows 上測試 Redis Cluster的集群填坑筆記

redis 集群實現的原理請參考http://www.tuicool.com/articles/VvIZje集群環境至少需要3個節點。推薦使用6個節點配置&#xff0c;即3個主節點&#xff0c;3個從節點。新建6個文件夾 分別是 7000/7001/7002/7003/7004/7005將redis.windows.conf 復制一份然后修改配置文件中的下面…

不成為編程天才的5種貢獻方式

安迪萊斯特&#xff08;Andy Lester&#xff09;早在三月發布了原始指南&#xff0c;其中介紹了14種不成為編程天才或搖滾明星的貢獻開源的方法 &#xff0c;我真的很喜歡這個想法。 這就是為什么我決定稍微采納一下這篇文章&#xff0c;并告訴您如何以及可以做什么來支持自己喜…