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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ2421 Constructing Roads 最小生成树

發布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ2421 Constructing Roads 最小生成树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

修路

時限:?2000MS?內存限制:?65536K
提交總數:?31810?接受:?14215

描述

有N個村莊,編號從1到N,您應該修建一些道路,使每兩個村莊可以相互連接。我們說兩個村莊A和B是連通的,當且僅當A和B之間有一條道路,或者存在一個村莊C使得A和C之間有一條道路,并且C和B連通時。

我們知道,一些村莊之間已經存在一些道路,您的工作是建造一些道路,以使所有村莊都連接起來,并且所有道路的長度都應最小。

輸入

第一行是整數N(3 <= N <= 100),它是村莊的數量。然后是N行,其中第i個包含N個整數,而這N個整數中的第j個是村莊i與村莊j之間的距離(該距離應為[1,1000]之內的整數)。

然后有一個整數Q(0 <= Q <= N *(N +1)/ 2)。然后出現Q條線,每條線包含兩個整數a和b(1 <= a <b <= N),這意味著已經建立了村莊a和村莊b之間的道路。

產量

您應該輸出包含整數的線,該整數是要連接所有村莊的所有道路的長度,并且該值是最小值。

樣本輸入

3 0 990 692 990 0 179 692 179 0 1 1 2

樣本輸出

179

資源

北京大學月刊,KICC

就是給了N個村莊,然后給你權值什么的 ,后面又給了一個數M,告訴你哪些路已經修好了,你就不用修了,最后問最小生成樹,問需要修的最短的路。

思路:把已經修建好的路的權值設置為0,這樣求和就不用重復計算,而且能保證這些之前的路優先選擇!

#include<iostream> #include<queue> #include<algorithm> #include<set> #include<cmath> #include<vector> #include<map> #include<stack> #include<bitset> #include<cstdio> #include<cstring> //---------------------------------Sexy operation--------------------------//#define cini(n) scanf("%d",&n) #define cinl(n) scanf("%lld",&n) #define cinc(n) scanf("%c",&n) #define cins(s) scanf("%s",s) #define coui(n) printf("%d",n) #define couc(n) printf("%c",n) #define coul(n) printf("%lld",n) #define debug(n) printf("%d_________________________________\n",n); #define speed ios_base::sync_with_stdio(0) #define file freopen("input.txt","r",stdin);freopen("output.txt","w",stdout) //-------------------------------Actual option------------------------------// #define rep(i,a,n) for(int i=a;i<=n;i++) #define per(i,n,a) for(int i=n;i>=a;i--) #define Swap(a,b) a^=b^=a^=b #define Max(a,b) (a>b?a:b) #define Min(a,b) a<b?a:b #define mem(n,x) memset(n,x,sizeof(n)) #define mp(a,b) make_pair(a,b) #define pb(n) push_back(n) #define dis(a,b,c,d) ((double)sqrt((a-c)*(a-c)+(b-d)*(b-d))) //--------------------------------constant----------------------------------//#define INF 0x3f3f3f3f #define esp 1e-9 #define PI acos(-1) using namespace std; #define maxn 1020 #define INF 0x3f3f3f3fusing namespace std;int dis[maxn][maxn]; int d[maxn]; bool vis[maxn]; int n,q; void prim() {for(int i = 1; i <= n; i ++){d[i] = dis[1][i];vis[i] = 0;}for(int i = 1; i <= n; i ++){int minx = INF;int now;for(int j = 1; j <= n; j ++){if(!vis[j] && minx > d[j]){now = j;minx = d[j];}}vis[now] = 1;for(int k = 1; k <= n; k ++){if(!vis[k] && d[k] > dis[now][k])d[k] = dis[now][k];}}int sum = 0;for(int i = 1; i <= n; i ++)sum += d[i];printf("%d\n",sum); } int main() {scanf("%d",&n);for(int i = 1; i <= n; i ++)for(int j = 1; j <= n; j ++){scanf("%d",&dis[i][j]);}scanf("%d",&q);int x,y;while(q --){scanf("%d%d",&x,&y);dis[x][y] = dis[y][x] = 0;}prim();return 0; }

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的POJ2421 Constructing Roads 最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。