HDU 1863 畅通工程
生活随笔
收集整理的這篇文章主要介紹了
HDU 1863 畅通工程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
暢通工程
Time Limit: 1000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 24998????Accepted Submission(s): 10867
?
Input 測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 N、村莊數目M ( < 100 );隨后的 N行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本(也是正整數)。為簡單起見,村莊從1到M編號。當N為0時,全部輸入結束,相應的結果不要輸出。
?
Output 對每個測試用例,在1行里輸出全省暢通需要的最低成本。若統計數據不足以保證暢通,則輸出“?”。?
Sample Input 3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100?
Sample Output 3 ??
Source 浙大計算機研究生復試上機考試-2007年 解析: 考察最小生成樹,并且需判斷能否構造出最小生成樹。 Kruskal #include <cstdio> #include <algorithm> using namespace std;int N, M;struct Edge{int u, v, w;bool operator < (const Edge& b)const{return w<b.w;} }; Edge e[5050]; int f[105];int getf(int x) {return x = f[x] ? f[x] : f[x] = getf(f[x]); }bool unite(int a, int b) {int t1 = getf(a);int t2 = getf(b);if(t1 != t2){f[t2] = t1;return true;}return false; }void kruskal() {for(int i = 1; i <= M; ++i)f[i] = i;sort(e, e+N);int cnt = 0;int ans = 0;bool success = false;for(int i = 0; i < N; ++i){if(unite(e[i].u, e[i].v)){ans += e[i].w;++cnt;}if(cnt == M-1){success = true;break;}}if(success)printf("%d\n", ans);elseprintf("?\n"); }int main() {while(scanf("%d%d", &N, &M), N){for(int i = 0; i < N; ++i){scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);}if(N < M-1) //明顯統計數據不足printf("?\n");elsekruskal();}return 0; }
?
?
Prim
#include <cstdio> #include <cstring>const int INF = 0x3f3f3f3f; int N, M; int e[105][105]; int dis[105]; bool vis[105];void prim() {for(int i = 1; i <= M; ++i)dis[i] = e[1][i];vis[1] = true;int ans = 0;int cnt = 1;bool success = true;while(cnt<M){int min_dis = INF, u;for(int i = 1; i <= M; ++i){if(!vis[i] && dis[i]<min_dis){min_dis = dis[u = i];}}if(min_dis == INF){success = false;break;}vis[u] = true;++cnt;ans += dis[u];for(int i = 1; i <= M; ++i){if(!vis[i] && e[u][i]<dis[i]){dis[i] = e[u][i];}}}if(success)printf("%d\n", ans);elseprintf("?\n"); }int main() {while(scanf("%d%d", &N, &M), N){memset(vis, 0, sizeof(vis));for(int i = 1; i <= M; ++i)for(int j = 1; j <= M; ++j)e[i][j] = (i == j ? 0 : INF);int u, v, w;for(int i = 1; i <= N; ++i){scanf("%d%d%d", &u, &v, &w);e[u][v] = e[v][u] = w;}if(N < M-1)printf("?\n");elseprim();}return 0; }
轉載于:https://www.cnblogs.com/inmoonlight/p/5671818.html
總結
以上是生活随笔為你收集整理的HDU 1863 畅通工程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未能正确加载“Microsoft.Vis
- 下一篇: 商品的会员价格