ACM题目————还是畅通工程

Submit Status

Description

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

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

Hint

Hint  Huge input, scanf is recommended.
        

最小生成树的题目,因为点比较少,可以直接用普里姆算法。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <stack>
#include <cmath>
#include <string>
#include <queue>
#define INF 0xffffff
using namespace std;
const int maxn = 101;
typedef long long ll ;
int n, m, x, y, v;
int G[maxn][maxn], d[maxn];
bool vis[maxn];

int prim(){
    int pt, ret, Min;
    memset(vis,false,sizeof(vis));
    memset(d,0x7f,sizeof(d));
    pt = 1;
    vis[1] = true;
    ret = 0;
    while( true ){
        for(int i=1; i<=n; i++)
            if( !vis[i] && G[pt][i] && d[i]>G[pt][i] )
                d[i] = G[pt][i];
        pt = -1;
        Min = INF ;
        for(int i=1; i<=n; i++){
            if( !vis[i] && Min > d[i] ){
                Min = d[i];
                pt = i;
            }
        }
        if( pt == -1 ) break;
        ret += Min;
        vis[pt] = true;
    }
    return ret;
}

int main(){
    while( ~scanf("%d",&n) && n){
        m = n * ( n - 1 ) / 2 ;
        memset(G,0,sizeof(G));
        while( m -- ){
            scanf("%d %d %d",&x,&y,&v);
            G[x][y] = G[y][x] = v ;
        }
        printf("%d\n",prim());
    }
    return 0 ;
}         

 

posted @ 2016-07-23 20:55  Asimple  阅读(664)  评论(0编辑  收藏  举报