HDU 1233

来源:互联网 发布:淘宝模块怎么添加名称 编辑:程序博客网 时间:2024/05/16 15:52

HDU 1233 - 还是畅通工程 - 最小生成树

  某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

Input

  测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。

  当N为0时,输入结束,该用例不被处理。

Output

  对每个测试用例,在1行里输出最小的公路总长度。

Sample Input

    3    1 2 1    1 3 2    2 3 4    4    1 2 1    1 3 4    1 4 1    2 3 3    2 4 2    3 4 5    0

Sample Output

    3    5

  中文题面就不需要解释了,思路也不需要说了吧,大水体,裸prim就可以,只是数据量可能比较大需要用scanf

////  main.cpp//  L////  Created by LucienShui on 2017/5/22.//  Copyright © 2017年 LucienShui. All rights reserved.//#include <iostream>#include <algorithm>#include <set>#include <string>#include <vector>#include <queue>#include <map>#include <iomanip>#include <cstdio>#include <cstring>#include <cmath>#include <cctype>#define memset(a,b) memset(a,b,sizeof(a))#define il inline#define ull unsigned long longusing namespace std;const int maxn = 107, INF = 0x3f3f3f3f;int mp[maxn][maxn],dis[maxn];bool vis[maxn];il void read(int n);il int prim(int n);il void init(int n);int main() {#ifndef ONLINE_JUDGE    freopen("in.txt", "r", stdin);#endif    int n;    while(scanf("%d",&n),n) {        init(n);        read(n);        cout << prim(n) << endl;    }    return 0;}il void read(int n) {    int m = (n*(n-1))>>1;    for(int i=0,u,v,w ; i<m ; i++) {        scanf("%d%d%d",&u,&v,&w);        mp[u][v] = mp[v][u] = w;    }}il void init(int n) {    for(int i=1 ; i<=n ; i++) {        mp[i][i]=INF;        for(int j=i+1 ; j<=n ; j++) {            mp[i][j]=mp[j][i]=INF;        }    }    memset(vis,false);}il int prim(int n) {    int cur=1,index=0,result={};    for(int i=2 ; i<=n ; i++) dis[i] = mp[cur][i];    vis[cur]=true;    for(int i=1 ; i<n ; i++) {        int minn = INF;        for(int j=2 ; j<=n ; j++) {            if(!vis[j] && minn > dis[j]) {                index = j;                minn = dis[j];            }        }        if(minn == INF) return -1;//no MST        result += minn;        vis[index]=true;        for(int j=2 ; j<=n ; j++) {            if(!vis[j] && dis[j] > mp[index][j]) {                dis[j] = mp[index][j];            }        }    }    return result;}
原创粉丝点击