PAT 7-14 公路村村通
阿新 • • 發佈:2019-03-29
-s http pat htm namespace esp minus dfs push_back
https://pintia.cn/problem-sets/1111189748004499456/problems/1111189831248850957
現有村落間道路的統計數據表中,列出了有可能建設成標準公路的若幹條道路的成本,求使每個村落都有公路連通所需要的最低成本。
輸入格式:
輸入數據包括城鎮數目正整數N(≤)和候選道路數目M(≤);隨後的M行對應M條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見,城鎮從1到N編號。
輸出格式:
輸出村村通需要的最低成本。如果輸入數據不足以保證暢通,則輸出−,表示需要建設更多公路。
輸入樣例:
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 <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; int N, M; int mp[3010][3010]; int vis[3010]; vector<int> v[3010]; int dis[3010]; void dfs(int st) { if(v[st].size() == 0) return; for(int i = 0; i < v[st].size(); i ++) { if(!vis[v[st][i]]) { vis[v[st][i]] = 1; dfs(v[st][i]); } } } void prime() { memset(dis, inf, sizeof(dis)); memset(vis, 0, sizeof(vis)); for(int i = 1; i <= N; i ++) dis[i] = mp[1][i]; dis[1] = 0; long long res = 0; int temp; for(int i = 1; i <= N; i ++) { int minn = inf; for(int j = 1; j <= N; j ++) { if(!vis[j] && dis[j] < minn) { minn = dis[j]; temp = j; } } vis[temp] = 1; for(int k = 1; k <= N; k ++) { if(!vis[k]) { dis[k] = min(dis[k], mp[temp][k]); } } } for(int i = 1; i <= N; i ++) res += dis[i]; printf("%lld\n", res); } int main() { memset(mp, inf, sizeof(mp)); scanf("%d%d", &N, &M); for(int i = 0; i < M; i ++) { int st, en, cos; scanf("%d%d%d", &st, &en, &cos); v[st].push_back(en); v[en].push_back(st); mp[st][en] = mp[en][st] = cos; } memset(vis, 0, sizeof(vis)); int cnt = 0; for(int i = 1; i <= N; i ++) { if(vis[i]) continue; cnt ++; dfs(i); } if(cnt > 1) printf("-1\n"); else prime(); return 0; }
dfs + prim mp 忘記初始化 wa 了四發 自己的 bug 自己改!
今天藍橋出成績 雖然是意料之內的省二但是還是有點失望 唉 周末的天梯拜托了啊 一定要加油啊!!!
PAT 7-14 公路村村通