日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

發(fā)布時(shí)間:2025/3/16 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

還是暢通工程

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Time Limit: 4000/2000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)

Problem Description 某省調(diào)查鄉(xiāng)村交通狀況,得到的統(tǒng)計(jì)表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標(biāo)是使全省任何兩個(gè)村莊間都可以實(shí)現(xiàn)公路交通(但不一定有直接的公路相連,只要能間接通過(guò)公路可達(dá)即可),并要求鋪設(shè)的公路總長(zhǎng)度為最小。請(qǐng)計(jì)算最小的公路總長(zhǎng)度。

Input 測(cè)試輸入包含若干測(cè)試用例。每個(gè)測(cè)試用例的第1行給出村莊數(shù)目N ( < 100 );隨后的N(N-1)/2行對(duì)應(yīng)村莊間的距離,每行給出一對(duì)正整數(shù),分別是兩個(gè)村莊的編號(hào),以及此兩村莊間的距離。為簡(jiǎn)單起見(jiàn),村莊從1到N編號(hào)。
當(dāng)N為0時(shí),輸入結(jié)束,該用例不被處理。

Output 對(duì)每個(gè)測(cè)試用例,在1行里輸出最小的公路總長(zhǎng)度。

Sample Input 3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
Sample Output 3 5HintHint Huge input, scanf is recommended.

?在無(wú)向帶權(quán)連通圖G中,如果一個(gè)連通子樹(shù)包含所有頂點(diǎn),并且連接這些頂點(diǎn)的邊權(quán)之和最小,

那么這個(gè)連通子圖就是G的最小生成樹(shù)。求最小生成樹(shù)的一個(gè)常見(jiàn)算法是Prim算法。


prim算法(時(shí)間復(fù)雜度為O(n^3)):

Prim算法的基本思想是:

1)設(shè)置兩個(gè)集合V和S,任意選擇一個(gè)頂點(diǎn)作為起始頂點(diǎn),將起始頂點(diǎn)放入集合S,其余頂點(diǎn)存入集合

V中;2)然后使用貪心策略,選擇一條長(zhǎng)度最短并且端點(diǎn)分別在S和V中邊(即為最小生成樹(shù)的中的一條

邊),將這條邊在V中的端點(diǎn)加入到集合S中;3)循環(huán)執(zhí)行第2)步直到S中包含了所有頂點(diǎn)。


#include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f int map[100][100],s[100],vis[100]; int n,m; int prim() {int i,j,t,p,min,minpos,cnt;int ans=0;cnt=0; /*記錄已經(jīng)加入的點(diǎn)的個(gè)數(shù)*/vis[1]=1; /*從第一個(gè)點(diǎn)開(kāi)始找*/s[cnt++]=1; /*s數(shù)組保存已經(jīng)加入的點(diǎn)*/while(cnt<n) /*點(diǎn)還沒(méi)有加入完*/{t=cnt;min=inf;for(i=0;i<t;i++) {p=s[i];for(j=1;j<=n;j++){if(!vis[j]&&map[p][j]<min) /*在已經(jīng)加入的點(diǎn)和沒(méi)加入的點(diǎn)之間找出一條最短路,*/{min=map[p][j];minpos=j; /*記錄下新找到的最短路的端點(diǎn)*/}}}ans+=min; s[cnt++]=minpos; /*更新已經(jīng)加入的點(diǎn)*/vis[minpos]=1; }return ans; } int main() {int u,v,w,i;while(~scanf("%d",&n)&&n){m=n*(n-1)/2;memset(vis,0,sizeof(vis));memset(map,inf,sizeof(map));for(i=0;i<m;i++){scanf("%d%d%d",&u,&v,&w);map[u][v]=w;map[v][u]=w;}int sum=prim();printf("%d\n",sum);}return 0; }

上面的算法有三個(gè)循環(huán),時(shí)間復(fù)雜度為O(N^3),考慮到由于使用的是貪心策略,則每添加一個(gè)新頂點(diǎn)到集合S中的時(shí)候,才會(huì)改變V中每個(gè)點(diǎn)到S中的點(diǎn)的最小邊的長(zhǎng)度。因此可以用一個(gè)數(shù)組nearest[N](N為頂點(diǎn)個(gè)數(shù))記錄在生成最小數(shù)的過(guò)程中,記錄V中每個(gè)點(diǎn)的到S中點(diǎn)的最小邊長(zhǎng),用另外一個(gè)數(shù)組adj[N]記錄使得該邊最小的對(duì)應(yīng)的鄰接點(diǎn)。那么O(N)的時(shí)間了找到最短的邊,并且能在O(N)的時(shí)間里更新nearest[N]和adj[N]。因此可以得到O(N^2)的算法。

#include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f int map[100][100]; int n,m; /*記當(dāng)前生成樹(shù)的節(jié)點(diǎn)集合為S,未使用的節(jié)點(diǎn)結(jié)合為V*/ int vis[100]; //標(biāo)記某個(gè)點(diǎn)是否在S中 int adj[100]; //記錄與S中的點(diǎn)最接近的點(diǎn) int nearest[100]; //記錄V中每個(gè)點(diǎn)到S中的點(diǎn)的最短邊 int prim() {int i,j,min;int ans=0;vis[1]=1;for(i=2;i<=n;i++){nearest[i]=map[1][i]; adj[i]=1;}int cnt=n-1; /*記錄邊的條數(shù)*/while(cnt--){min=inf;j=1;for(i=1;i<=n;i++){if(!vis[i]&&nearest[i]<min){min=nearest[i];j=i;}}ans+=map[j][adj[j]];vis[j]=1;for(i=1;i<=n;i++){if(!vis[i]&&map[i][j]<nearest[i]){nearest[i]=map[i][j]; /*找最短的邊*/adj[i]=j; /*找最接近的點(diǎn)*/}}}return ans; } int main() {int i,sum,u,v,w;while(~scanf("%d",&n)&&n){memset(vis,0,sizeof(vis));memset(map,0,sizeof(map));m=n*(n-1)/2;for(i=0;i<m;i++){scanf("%d%d%d",&u,&v,&w);map[u][v]=map[v][u]=w;}sum=prim();printf("%d\n",sum);}return 0 ; }




Kruskal算法(時(shí)間復(fù)雜度O(ElogE),E為邊數(shù)):

給定無(wú)向連同帶權(quán)圖G = (V,E),V = {1,2,...,n}。Kruskal算法構(gòu)造G的最小生成樹(shù)的基本思想是:

(1)首先將G的n個(gè)頂點(diǎn)看成n個(gè)孤立的連通分支。將所有的邊按權(quán)從小大排序。

(2)從第一條邊開(kāi)始,依邊權(quán)遞增的順序檢查每一條邊。并按照下述方法連接兩個(gè)不同的連通分支:當(dāng)查看到第k條邊(v,w)時(shí),如果端點(diǎn)v和w分別是當(dāng)前兩個(gè)不同的連通分支T1和T2的端點(diǎn)是,就用邊(v,w)將T1和T2連接成一個(gè)連通分支,然后繼續(xù)查看第k+1條邊;如果端點(diǎn)v和w在當(dāng)前的同一個(gè)連通分支中,就直接再查看k+1條邊。這個(gè)過(guò)程一個(gè)進(jìn)行到只剩下一個(gè)連通分支時(shí)為止。

此時(shí),已構(gòu)成G的一棵最小生成樹(shù)。


#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int father[100]; int n,m; struct point {int u;int v;int w; }a[5000]; bool comp(point a1,point a2) /*按權(quán)值從小到大排序*/ {return a1.w<a2.w; } void initial() /*并查集初始化*/ {for(int i=0;i<=100;i++)father[i]=i; } int find(int x) /*查找根節(jié)點(diǎn)*/ {if(father[x]==x)return x;return find(father[x]); } void merge(int p,int q) /*合并兩個(gè)集合*/ {int pp=find(p);int qq=find(q);if(pp!=qq){if(pp<qq)father[qq]=pp;elsefather[pp]=qq;} } int kruskal() {initial(); /*初始化*/int ans=0;sort(a+1,a+m+1,comp); /*排序*/for(int i=1;i<=m;i++){int x=find(a[i].u);int y=find(a[i].v);if(x!=y) /*兩端點(diǎn)不屬于同一集合*/{ans+=a[i].w;merge(x,y); /*合并*/}}return ans; } int main() {int i,sum;while(~scanf("%d",&n)&&n!=0){m=n*(n-1)/2;for(i=1;i<=m;i++)scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);sum=kruskal();printf("%d\n",sum);}return 0; }


總結(jié)

以上是生活随笔為你收集整理的hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: jizz18国产| 巨胸挤奶视频www网站 | 一级片少妇 | 激情综合激情 | 夜夜嗨av一区二区三区网页 | 人妻少妇精品无码专区久久 | 奇米久久 | 成人视屏在线 | 国产精品蜜臀 | 密臀av在线| 无码人妻精品一区二区三 | 日韩精品中文字幕在线 | 天天色天天干天天色 | 成人免费观看视频网站 | 久久久久久国产精品视频 | 日本精品一区二区三区视频 | 亚洲一区二区三区麻豆 | 男女无套免费视频网站动漫 | 欧美人吸奶水吃奶水 | 五月婷婷啪啪 | 无码人妻一区二区三区精品视频 | 日韩激情在线视频 | 欧美日韩久久久久 | 欧美性理论片在线观看片免费 | 天天性综合 | www.日韩一区| 激情五月婷婷综合网 | 久久国产免费观看 | 韩国19主播内部福利vip | 禁漫天堂免费网站 | 国产精品第三页 | 国产精品一区在线 | 国产免费无遮挡吸奶头视频 | 一区二区日韩欧美 | 精品国产一区二区三区日日嗨 | 一级黄色片在线 | 日本大乳奶做爰 | 亚洲精品国产免费 | 天堂在线观看视频 | 国产色网| www亚洲一区 | 亚洲AV无码一区二区三区少妇 | 欧美1区2区3区4区 | 一级黄色免费观看 | 成人免费黄 | 午夜小视频在线播放 | 国产在线v | 免费欧美黄色 | 三上悠亚激情av一区二区三区 | 日穴| 男生和女生靠逼视频 | 日韩成人在线播放 | 久久精品电影网 | 久久国产精品久久精品国产 | 欧美激情一级精品国产 | 一区二区精彩视频 | www.欧美激情 | 女女高潮h冰块play失禁百合 | 性爱动漫 | 播播网色播播 | 四虎永久免费在线观看 | 欧美午夜视频 | 精品国产99久久久久久 | 国产乱淫av麻豆国产免费 | 久久久免费精品视频 | 妺妺窝人体色777777 | 精品人妻在线一区二区三区 | 韩国激情呻吟揉捏胸视频 | 99精品一级欧美片免费播放 | 无遮挡av| 中文在线不卡 | 东北老女人av | 亚洲美女在线视频 | 欧美大黄视频 | a黄色片 | 在线视频麻豆 | 怡红院成人影院 | 欧洲性生活片 | 国产免费久久 | 中文字幕理伦片免费看 | 免费观看全黄做爰的视频 | 国产福利一区二区视频 | 午夜色婷婷 | 国产女人高潮的av毛片 | 人妖黄色片 | 免费毛片视频 | 爱爱精品| 精品久久成人 | 懂色aⅴ一区二区三区免费 国产精品99在线观看 | www.av网| 黑人精品欧美一区二区蜜桃 | 91免费网站在线观看 | 成人app在线| 香蕉视频毛片 | 少妇2做爰hd韩国电影 | 成人欧美一区二区 | 天天操天天操天天射 | 少妇aa| 污污在线观看视频 |