POJ2421 Constructing Roads 最小生成树
生活随笔
收集整理的這篇文章主要介紹了
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 最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj1251 Jungle Road
- 下一篇: 9月29日总结