最小生成樹練習1(克魯斯卡爾算法Kruskal)

今天刷一下水題練手入門,明天繼續。03061498

poj1861 Network(最小生成樹)新手入門題。

題意:輸出連接方案中最長的單根網線長度(必須使這個值是所有方案中最小的),然后輸出方案。

題解:本題沒有直接求生成樹,但如果連接n個集線器的方案多于n-1條邊,那么必存在回路,因此去掉某些邊剩下的邊和所有頂點構成一個生成樹。對于一個圖的最小生成樹來說,它的最大邊滿足所有生成樹的最大邊里最小,正和題意。

吐槽:題目樣例是錯的。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=1001;
 6 struct edge{
 7     int u,v,w;
 8 }e[15001];
 9 int f[N],a[N],ai;
10 int n,m,ma;
11 int cmp(edge a,edge b){
12     return a.w<b.w;
13 }
14 void init(){
15     for(int i=1;i<=n;++i)
16         f[i]=i;
17 }
18 int fin(int x){
19     if(x!=f[x])f[x]=fin(f[x]);
20     return f[x];
21 }
22 void Kruskal(){
23     ma=ai=0;
24     int u,v,i;
25     init();
26     for(i=0;i<m;++i){
27         u=e[i].u;
28         v=e[i].v;
29         if((u=fin(u))!=(v=fin(v))){
30             f[u]=v;
31             a[ai++]=i;
32             ma=max(e[i].w,ma);
33         }
34         if(ai>=n-1)break;
35     }
36 }
37 int main(){
38     int i,u,v,w;
39     scanf("%d%d",&n,&m);
40     for(i=0;i<m;++i){
41         scanf("%d%d%d",&u,&v,&w);
42         e[i]=edge{u,v,w};
43     }
44     sort(e,e+m,cmp);
45     Kruskal();
46     printf("%d\n%d\n",ma,ai);
47     for(i=0;i<ai;++i)
48         printf("%d %d\n",e[a[i]].u,e[a[i]].v);
49     return 0;
50 }
View Code

?

poj1251 Jungle Roads(最小生成樹)水題。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=27;
 6 struct edge{
 7     int u,v,w;
 8 }e[75];
 9 int f[N];
10 int n,m,ans;
11 int cmp(edge a,edge b){
12     return a.w<b.w;
13 }
14 void init(){
15     for(int i=0;i<n;++i)
16         f[i]=i;
17 }
18 int fin(int x){
19     if(x!=f[x])f[x]=fin(f[x]);
20     return f[x];
21 }
22 void Kruskal(){
23     ans=0;
24     int u,v,i;
25     init();
26     for(i=0;i<m;++i){
27         u=e[i].u;
28         v=e[i].v;
29         if((u=fin(u))!=(v=fin(v))){
30             f[u]=v;
31             ans+=e[i].w;
32         }
33     }
34 }
35 int main(){
36     int i,j,w,k;
37     char u[3],v[3];
38     while(scanf("%d",&n),n){
39         m=0;
40         for(i=0;i<n-1;++i){
41             scanf("%s %d",u,&k);
42             for(j=0;j<k;++j){
43                 scanf("%s %d",v,&w);
44                 e[m++]={u[0]-'A',v[0]-'A',w};
45             }
46         }
47         sort(e,e+m,cmp);
48         Kruskal();
49         printf("%d\n",ans);
50     }
51     return 0;
52 }
View Code

?

poj1287 Networking(最小生成樹)水題。

用prim要注意兩個地點之間的線路可能多條,即有重邊。我這里練的是Kruskal,題目沒給邊數,但知道點數最多50,則邊數最多50*49/2=1225條,有重邊,開大點數組就行,因為數據弱,隨便開個1500都過了,醉。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int M=1500;
 6 struct edge{
 7     int u,v,w;
 8 }e[M];
 9 int f[50];
10 int n,m,ans;
11 int cmp(edge a,edge b){
12     return a.w<b.w;
13 }
14 void init(){
15     for(int i=1;i<=n;++i)
16         f[i]=i;
17 }
18 int fin(int x){
19     if(x!=f[x])f[x]=fin(f[x]);
20     return f[x];
21 }
22 void Kruskal(){
23     ans=0;
24     int u,v,i;
25     init();
26     for(i=0;i<m;++i){
27         u=e[i].u;
28         v=e[i].v;
29         if((u=fin(u))!=(v=fin(v))){
30             f[u]=v;
31             ans+=e[i].w;
32         }
33     }
34 }
35 int main(){
36     int i,u,v,w;
37     while(scanf("%d",&n),n){
38         scanf("%d",&m);
39         for(i=0;i<m;++i){
40             scanf("%d%d%d",&u,&v,&w);
41             e[i]={u,v,w};
42         }
43         sort(e,e+m,cmp);
44         Kruskal();
45         printf("%d\n",ans);
46     }
47     return 0;
48 }
View Code

?

poj2031 Building a Space Station(最小生成樹)題目看老久,其實挺水…空間站存在一些球形單間,如果單間之間接觸,重疊或用走廊連接則連通。給出單間坐標和半徑,求要使得所有單間相連通的走廊總長度的最小值。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 const int M=5000;
 7 const int N=100;
 8 struct edge{
 9     int u,v;
10     double w;
11 }e[M];
12 double a[N],b[N],c[N],r[N];
13 int f[N];
14 int n,m;
15 double ans;
16 int cmp(edge a,edge b){
17     return a.w<b.w;
18 }
19 double dist(int i,int j){
20     return sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j])+(c[i]-c[j])*(c[i]-c[j]))-r[i]-r[j];
21 }
22 void init(){
23     for(int i=0;i<n;++i) f[i]=i;
24 }
25 int fin(int x){
26     if(x!=f[x])f[x]=fin(f[x]);
27     return f[x];
28 }
29 void Kruskal(){
30     ans=0;
31     int u,v,i,cnt=0;
32     init();
33     for(i=0;cnt<n-1;++i){
34         u=e[i].u;
35         v=e[i].v;
36         if((u=fin(u))!=(v=fin(v))){
37             f[u]=v;
38             ans+=e[i].w;
39             cnt++;
40         }
41     }
42 }
43 int main(){
44     int i,j;
45     double w;
46     while(scanf("%d",&n),n){
47         for(i=0;i<n;++i){
48             scanf("%lf%lf%lf%lf",&a[i],&b[i],&c[i],&r[i]);
49         }
50         for(m=i=0;i<n-1;++i){
51             for(j=i+1;j<n;++j){
52                 w=dist(i,j);
53                 if(w<0) w=0;
54                 e[m++]={i,j,w};
55             }
56         }
57         sort(e,e+m,cmp);
58         Kruskal();
59         printf("%.3f\n",ans);
60     }
61     return 0;
62 }
View Code

?

poj2421 Constructing Roads(最小生成樹)水題。有些點已經連邊,進行標記,加邊時將其邊賦值為0即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int M=5000;
 6 const int N=101;
 7 struct edge{
 8     int u,v,w;
 9 }e[M];
10 int f[N];
11 int g[N][N],vis[N][N];
12 int n,ans;
13 int cmp(edge a,edge b){
14     return a.w<b.w;
15 }
16 void init(){
17     for(int i=1;i<=n;++i) f[i]=i;
18 }
19 int fin(int x){
20     if(x!=f[x])f[x]=fin(f[x]);
21     return f[x];
22 }
23 void Kruskal(){
24     ans=0;
25     int u,v,i,cnt=0;
26     init();
27     for(i=0;cnt<n-1;++i){
28         u=e[i].u;
29         v=e[i].v;
30         if((u=fin(u))!=(v=fin(v))){
31             f[u]=v;
32             ans+=e[i].w;
33             cnt++;
34         }
35     }
36 }
37 int main(){
38     int i,j,a,b,ei,m;
39     while(scanf("%d",&n)==1){
40         for(i=1;i<=n;++i)
41             for(j=1;j<=n;++j)
42             scanf("%d",&g[i][j]);
43         memset(vis,0,sizeof(vis));
44         scanf("%d",&m);
45         while(m--){
46             scanf("%d%d",&a,&b);
47             vis[a][b]=1;
48         }
49         ei=0;
50         for(i=1;i<n;++i){
51             for(j=i+1;j<=n;++j){
52                 if(vis[i][j]) e[ei++]={i,j,0};
53                 else  e[ei++]={i,j,g[i][j]};
54             }
55         }
56         sort(e,e+ei,cmp);
57         Kruskal();
58         printf("%d\n",ans);
59     }
60     return 0;
61 }
View Code

?

轉載于:https://www.cnblogs.com/GraceSkyer/p/5774634.html

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

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

相關文章

java變量不聲明可以直接使用嗎_我們可以在不使用Java進行初始化的情況下聲明最終變量嗎?...

在Java中&#xff0c;final是可與字段類和方法一起使用的access修飾符。當一個方法為final時&#xff0c;它不能被覆蓋。當變量為最終變量時&#xff0c;其值無法進一步修改。當類結束時&#xff0c;不能擴展。無需初始化即可聲明最終變量如果稍后聲明了最終變量&#xff0c;則…

系統測試:單元測試相關知識筆記

一、單元測試概念單元測試也成為模塊測試&#xff0c;在模塊編寫完成且無編譯錯誤后就可以進行。單元測試側重模塊中的內部處理邏輯和數據結構。如果采用機器測試&#xff0c;一般用白盒測試法。二、單元測試檢查模塊特征1、模塊接口模塊接口保證了測試模塊數據流可以正確地流入…

跨網段遠程調試vs_如何提高后臺服務應用問題的排查效率?日志 VS 遠程調試

轉眼間&#xff0c;距離Jerry最近一篇文章推送已經過去了一個多月的時間了。公眾號更新的頻率降低&#xff0c;不是因為Jerry偷懶&#xff0c;而是由于從春節過后&#xff0c;我所在的SAP成都研究院數字創新空間整個團隊&#xff0c;一直在忙一個5月份需要交付的項目上。Jerry每…

計算機硬件知識:BIOS、EFI與UEFI詳解!

本文估計很多小白看不懂&#xff0c;但是還是建議你硬著頭皮看完&#xff0c;這篇文章主要講解了這幾種“BIOS”的啟動方式&#xff0c;對電腦啟動問題判斷的理解會有益處。BIOS是個程序&#xff0c;存儲在BIOS芯片中&#xff0c;而現在的新式電腦用的基本都是UEFI啟動&#xf…

java pdf 導出下載_Java+PDF模板導出成pdf文件,并下載

1&#xff0c;根據前人經驗&#xff0c;熟悉完成基礎操作&#xff1a;https://www.cnblogs.com/wangpeng00700/p/8418594.html?tdsourcetags_pcqq_aiomsg2&#xff0c;根據鏈接中操作完成之后&#xff0c;在本地生成pdf文件已經沒有問題了。但如果放到&#xff0c;Linux服務器…

在db2數據庫上模擬死鎖場景 還是z上的

如果條件允許&#xff0c;起兩個線程互相搶資源就行了&#xff0c;但問題是&#xff0c;時間上還需要同步&#xff0c;要做到完美控制&#xff0c;還得加其他邏輯&#xff0c;忒費事&#xff0c;所以可以用下面的辦法&#xff1a; 在目標表上直接加個鎖……簡單&#xff0c;粗暴…

條件隨機場 python_用條件隨機場做網絡小說命名實體識別

一直想用統計學習方法來改善撥云搜索&#xff0c;這次先在命名實體上小小嘗試一下。線性鏈條件隨機場對于無向圖中的節點&#xff0c;定義一組特征函數&#xff0c;使其狀態僅受鄰近節點和觀測序列的影響。在標注任務中&#xff0c;節點只有前后兩個鄰近節點&#xff0c;即線性…

項目開發基礎:常用測試方法介紹

1、集成測試集成測試就是把模塊按照設計說明書的要求組合起來進行測試。1.1、集成測試方法&#xff1a;a、分別測試各個模塊&#xff0c;再把這些模塊組合起來進行整體測試&#xff0c;也就是非增量式集成。特點&#xff1a;可以對模塊進行并行測試&#xff0c;能充分利用人力&…

java 多數據源處理_java – 用于處理多個數據源的Spring事務管理

這可能是一個重復的問題,但我找不到(至少我無法理解)一個滿意的答案,因此再次提問.我正在使用兩個數據源(MySQL和Oracle).以下是執行流程&#xff1a;主方法-A調用方法-B(寫入Oracle DB)然后它(方法-A)調用方法-C(寫入mySQL DB)然后它(方法-A)調用方法-D(寫入Oracle DB) ).如果…

MyBatis Generator

1 <?xml version"1.0" encoding"UTF-8"?>2 <!DOCTYPE generatorConfiguration3 PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"4 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"&g…

svd奇異值分解_NCL專輯 | 奇異值分解(SVD)

奇異值分解SVD(Singular Value Decomposition)是一種矩陣分解方法&#xff0c;在氣象領域中常用來分析兩個氣象場場之間的關系。NCL的函數庫中與SVD相關的函數包括svd_lapack&#xff0c;svdcov&#xff0c;svdcov_sv&#xff0c;svdstd&#xff0c;svdstd_sv。svd_lapack&…

項目測試基礎:白盒測試相關知識筆記

1、白盒測試概念白盒測試又稱為結構測試&#xff0c;主要是根據程序的內部結構和邏輯來設計測試用例&#xff0c;然后對程序的路徑和過程進行測試&#xff0c;檢查是否滿足設計的需要。2、白盒測試常用的技術介紹白盒測試常用的技術有邏輯覆蓋、循環覆蓋、基本路徑測試。2.1 邏…

java全局變量和局部變量

分類&#xff1a; 變量按作用范圍劃分分為全局變量&#xff08;成員變量&#xff09;和局部變量 成員變量按調用方式劃分分為實例屬性與類屬性 局部變量按定義位置劃分分為形參&#xff0c;方法局部變量&#xff0c;代碼塊局部變量 成員變量&#xff1a; 直接在類中聲明的…

電腦系統知識:Windows原版系統與Ghost系統的區別,你知道嗎?

經常看到有電腦小白的朋友問原版操作系統跟Ghost的區別是什么&#xff0c;該怎么選擇安裝哪種系統&#xff1f;今天在這里就說說它們之間的聯系與區別。Windows原版系統&#xff1a;原版系統就是微軟推送給用戶的原始“干凈”的系統。系統不含第三方的軟件&#xff0c;軟件補丁…

sql server update觸發器_SQL Server 觸發器

T-SQL 觸發器觸發器分為BEFORE觸發器*(SQL Server不支持&#xff0c;Oracle支持)在事件發生時觸發。AFTER觸發器是 SQLServer生成的最初用于自動相應數據修改的機制。在 SQLServer200以前的版本中 AFTER觸發器是唯一的觸發器&#xff0c;因此不用指明 AFTER&#xff0c;也可以用…

iOS 公司開發者賬號申請

對于獨立開發者很有用,收藏起來,以備不時之需! 蘋果開發者賬號分三種。 個人賬號&#xff1a;個人申請用于開發蘋果app所使用的賬號&#xff0c;僅限于個人使用&#xff0c;申請比較容易&#xff0c;$99。 公司賬號&#xff1a;以公司的名義申請的開發者賬號&#xff0c;用于公…

php渲染視圖,Laravel 視圖渲染:Blade 模板引擎

Laravel 視圖渲染&#xff1a;Blade 模板引擎由 學院君 創建于3年前, 最后更新于 2年前版本號 #153378 views27 likes0 collectsBlade 簡介Blade 是由 Laravel 提供的非常簡單但功能強大的模板引擎&#xff0c;不同于其他流行的 PHP 模板引擎&#xff0c;Blade 在視圖中并不約束…