2-1 公路村村通 (25 分)
生活随笔
收集整理的這篇文章主要介紹了
2-1 公路村村通 (25 分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現有村落間道路的統計數據表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。
輸入格式:
輸入數據包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3N);隨后的M行對應M條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見,城鎮從1到N編號。
輸出格式:
輸出村村通需要的最低成本。如果輸入數據不足以保證暢通,則輸出?1,表示需要建設更多公路。
輸入樣例:
6 15 1 2 5 1 3 3 1 4 7 1 5 4 1 6 2 2 3 4 2 4 6 2 5 2 2 6 6 3 4 6 3 5 1 3 6 1 4 5 10 4 6 8 5 6 3輸出樣例:
12 #include<stdio.h> #include<string.h> int map[1001][1001]; int minCost[1001];//記錄與該頂點鄰接的邊最小權值 int visited[1001];//記錄是否訪問過 int N,M; int min(int a,int b) {return a > b ? b : a; } int prime() {int i,sum=0,v;for(i=1;i<=N;i++) minCost[i]=99999999;//初始化為最大minCost[1]=0;while(1){v = -1;for(i=1;i<=N;i++)//找到權值最小的邊所對應的頂點{if(!visited[i]&&(v==-1||minCost[v]>minCost[i]))v = i;}if(v==-1)break;//說明頂點都已經經過了if(minCost[v]==99999999)return 0;//如果有個孤立頂點,最小權值不會變,可以判斷圖是否連通 visited[v]=1;sum+=minCost[v];for(i=1;i<=N;i++){if(map[v][i])minCost[i]=min(minCost[i],map[v][i]);//每次更新與頂點鄰接的邊的最小權值}}return sum; } int main() {int i;int city1,city2,cost;scanf("%d %d",&N,&M);for(i=0;i<M;i++){scanf("%d %d %d",&city1,&city2,&cost);map[city1][city2]=cost;//為0的值都是不關聯的map[city2][city1]=cost;}int sum = prime();if(sum)printf("%d\n",sum);elseprintf("-1\n");return 0; }?prime感覺就是找當前沒訪問過的點中權值最小的;
然后以它為中心更新它可以連接的點的權值? ?:
在(map[v][i])里找
(這可以是無向圖也可以是雙向圖)
PTA-09-最小生成樹 公路村村通 Prime算法(c語言)_lzl2040的博客-CSDN博客https://blog.csdn.net/qq_41234663/article/details/106501525?spm=1001.2014.3001.5502
總結
以上是生活随笔為你收集整理的2-1 公路村村通 (25 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何快速删除CAD图纸中的批注?
- 下一篇: ElasticSearch入门与Sens