Poj 1258 Agri-Net

http://poj.org/problem?id=1258

题意:给N个点,和N*N的矩阵(表示Ni到Nj的距离),求连通所有点的最小距离。

题解:最小生成树模板……prim……

每两个点之间距离不超过100,000,刚看时INF打成了10,010……Holy shit……怒WA……

 1 //
 2 //  main.cpp
 3 //  POJ 1258
 4 //
 5 //  Created by zhang on 14-3-31.
 6 //  Copyright (c) 2014年 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <cstdio>
11 #include <algorithm>
12 
13 using namespace std;
14 
15 const int maxn=110;
16 const int INF=1001000;
17 int cost[maxn][maxn];
18 int MINC[maxn];
19 bool used[maxn];
20 int V;
21 
22 int prim()
23 {
24     for (int i=0; i<V; i++) {
25         MINC[i]=INF;
26         used[i]=false;
27     }
28     MINC[0]=0;
29     int res=0;
30     while (1) {
31         int v=-1;
32         for (int u=0; u<V; u++) {
33             if (!used[u]&&(v==-1||MINC[u]<MINC[v])) {
34                 v=u;
35             }
36         }
37         if (v==-1) {
38             break;
39         }
40         used[v]=true;
41         res+=MINC[v];
42         for (int u=0; u<V; u++) {
43             MINC[u]=min(MINC[u],cost[v][u]);
44         }
45     }
46     return res;
47 }
48 int main()
49 {
50     //freopen("/Users/apple/Desktop/POJ 1258/POJ 1258/in", "r", stdin);
51     //freopen("/Users/apple /Desktop/POJ 1258/POJ 1258/out", "w", stdout);
52     int N;
53     while (scanf("%d",&N)!=EOF) {
54         V=N;
55         for (int i=0; i<N; i++) {
56             for (int j=0; j<N; j++) {
57                 cin>>cost[i][j];
58                 //scanf("%d",&cost[i][j]);
59             }
60         }
61         printf("%d
",prim());
62     }
63     return 0;
64 }
原文地址:https://www.cnblogs.com/der-z/p/3636838.html