zrq495
www.zrq495.com

最小生成树。

Prim 算法。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 int map[102][102];
 8 
 9 int prim(int n)
10 {
11     int i, j, min, sum=0;
12     int pos, vis[102], d[102];
13     memset(vis, 0, sizeof(vis));
14     for (i=1; i<=n; i++)
15         d[i]=map[1][i];
16     vis[1]=1;
17     for (i=1; i<n; i++)
18     {
19         min=10000000;
20         for (j=1; j<=n; j++)
21         {
22             if (vis[j] == 0 && min >= d[j])
23             {
24                 min=d[j];
25                 pos=j;
26             }
27         }
28         vis[pos]=1;
29         sum+=min;
30         for (j=2; j<=n; j++)
31         {
32             if (vis[j] == 0 && d[j] > map[pos][j])
33             {
34                 d[j]=map[pos][j];
35             }
36         }
37     }
38     return sum;
39 }
40 
41 int main()
42 {
43     int n, m, i, j;
44     int a, b, d, sum;
45     while(scanf("%d%d", &n ,&m) && n)
46     {
47         for (i=0; i<=m; i++)
48             for (j=0; j<=m; j++)
49                 map[i][j]=10000000;
50         for (i=0; i<=m; i++)
51             map[i][i]=0;
52         for (i=0; i< n; i++)
53         {
54             scanf("%d%d%d", &a, &b, &d);
55             map[a][b]=map[b][a]=d;
56         }
57         sum=prim(m);
58         if (sum >= 10000000) printf("?\n");
59         else
60             printf("%d\n", sum);
61     }
62 }
posted on 2012-08-06 20:10  zrq495  阅读(186)  评论(0编辑  收藏  举报