傳送門
題目描述:
現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。
輸入格式:
輸入資料報括城鎮數目正整數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樣例示意圖:
將輸入資料按照關鍵字cost進行公升序排序。
村村通的最小生成樹。
題目思路:最小生成樹的求解。
#include
#include
int n,m;
int sum=
0,count=0;
int parent[
1001];
struct nodea[
3001];
/*並查集之初始化操作*/
void
init()
/*並查集之查詢根節點操作*/
intfind
(int x)
/*qsort()比較函式*/
intcmp
(const
void
*a,const
void
*b)/*將邊按權值排好序後,如果加入該邊不構成迴路,則將該邊加入圖中。*/
void
kruskal()
}}intmain()
qsort
(a,m,
sizeof
(struct node)
,cmp)
;init()
;kruskal()
;for
(i=1
;i<=n;i++)if
(count==1)
printf
("%d"
,sum)
;else
printf
("-1");
return0;
}
prim演算法求解:
#include
#include
#define inf 65535
int n,m;
int map[
1001][
1001];
int visited[
1001];
int dist[
1001];
void
init()
}int
prim
(int s)
}
visited[pos]=1
;for
(j=1
;j<=n;j++)}
for(i=
1;i<=n;i++
)return sum;
}int
main()
printf
("%d"
,prim(1
));return0;
}
7 10 公路村村通
通過的 以及注釋,注釋最多的地方,是思考的最多的地方 include include includeusing namespace std define n 1005 下次不要用n來命名,不然容易和下面的n弄混,unnecessarily int f n 樹的母節點,例如節點1的母節點f 1 2,那...
7 10 公路村村通
7 10 公路村村通 30 分 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及...
PAT 7 10 公路村村通
現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見...