图结构练习——最小生成树(Prim算法)

Think:
修建路 的问题, 对 Prim算法还是不怎么理解。。加油吧。。。

Problem Description
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。

Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。

Output
每组输出占一行,仅输出最小花费。
Example Input

3 2
1 2 1
1 3 1
1 0

Example Output

2
0

#include
#define MAX 0x3f3f3f;
using namespace std;

int Map[1050][1050];
int dis[1050];
int vis[1050];

int Prim (int n);

int main()
 {
  int n, m;
  int i, j;
  int a, b, c;
  while (cin >> n >> m)
    {
      memset(vis, 0, sizeof(vis));
       for (i = 1;i <= n;i ++)
        {
          for (j = 1;j <= n;j ++)
             {
                if (i == j)
                   Map[i][j] = 0;
                else
                   Map[i][j] = MAX;
             }
        }
        for (i = 1;i <= m;i ++)
           {
             cin >> a >> b >> c;
             if (Map[a][b] > c)
                {
                  Map[a][b] = Map[b][a] = c;
                }
           }
        int ans = Prim(n);
        cout << ans << endl;
    }
 return 0;
 }

 int Prim (int n)
  {
    int i, j, t;
    int sum = 0;
    vis[0] = 1;
    for (i = 1;i <= n;i ++)
       {
         for (j = 1;j <= n;j ++)
             {
                dis[i] = Map[i][j];
             }
       }
    for (i = 1;i <= n;i ++)
       {
          t = i;
          int MIN = MAX;
          for (j = 1;j <= n;j ++)
              {
                 if (MIN > dis[j] && !vis[j])
                      {
                        MIN = dis[j];
                        t = j;
                      }

              }
         sum = sum + MIN;
         vis[t] = 1;
         for (j = 1;j <= n;j ++)
            {
                if (Map[t][j] < dis[j]&&!vis[j])
                   {
                      dis[j] = Map[t][j];
                    }
            }
       }
     return sum;
  }


/***************************************************
User name: 
Result: Accepted
Take time: 40ms
Take Memory: 568KB
Submit time: 2017-02-20 15:35:03
****************************************************/

你可能感兴趣的:(图,最小生成树)