poj 1258 Agri-Net 解题报告

题目链接:http://poj.org/problem?id=1258

题目意思:给出 n 个 farm,每个farm 之间通过一定数量的fiber 相连,问使得所有farm 直接或间接连通的 最少 fiber 数是多少。

     赤裸裸的最小生成树,用prim做的。

     有个地方写错,wa 了 几次。

    

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 const int farm_num = 10000 + 10;
 6 const int INF = 1e9;
 7 int farm[farm_num][farm_num];
 8 int dist[farm_num], vis[farm_num];
 9 int ans, N;
10 
11 void prim()
12 {
13     int k;
14     for (int i = 1; i <= N; i++)
15     {
16         vis[i] = 0;
17         dist[i] = INF;
18     }
19     // 假设从编号为 1 的farm 出发
20     dist[1] = 0, ans = 0;
21     for (int i = 1; i <= N; i++)
22     {
23         int tmp = INF;
24         for (int j = 1; j <= N; j++)
25         {
26             if (!vis[j] && dist[j] < tmp)
27             {
28                 tmp = dist[j];
29                 k = j;
30             }
31         }
32         vis[k] = 1;
33         ans += tmp;
34         for (int j = 1; j <= N; j++)
35         {
36             if (!vis[j] && dist[j] > farm[k][j])  // 一开始将dist[j] > farm[k][j]直接写成farm[k][j]了= =
37                 dist[j] = farm[k][j];
38         }
39     }
40 }
41 
42 int main()
43 {
44     while (scanf("%d", &N) != EOF)
45     {
46         for (int i = 1; i <= N; i++)
47         {
48             for (int j = 1; j <= N; j++)
49                 scanf("%d", &farm[i][j]);
50         }
51         prim();
52         printf("%d\n", ans);
53     }
54     return 0;
55 }

 

    

posted @ 2014-08-15 21:50  windysai  阅读(506)  评论(0编辑  收藏  举报