sicily 1090 Highways

求最小生成树的长度最小的边,我用的是prim算法:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const int INF=0x3f3f3f3f;
 7 int map[505][505];
 8 int visit[505];
 9 int dis[505];
10 int ans[505];
11 
12 //最小生成树 
13 int prim(int n, int cur) //从哪个点开始都可以 
14 {
15     memset(ans, 0, sizeof(ans));
16     visit[cur] = 1;
17     int index;
18     int count=0;
19     for(int i=1; i<=n; i++)
20         dis[i] = map[cur][i]; //dis[i]为到每个相邻顶点的最小距离 
21     
22     for(int i=2; i<=n; i++)
23     {
24         int minn = 0x3f3f3f3f;
25         for(int j=1; j<=n; j++)
26         {
27             if(!visit[j] && dis[j] < minn)
28             {
29                 minn = dis[j];
30                 index = j;
31             } 
32         }
33         visit[index] = 1;
34         ans[count++] = minn;
35         
36         for(int j=1; j<=n; j++)
37             if(!visit[j] && dis[j] > map[index][j])
38                 dis[j] = map[index][j];
39     }
40     return count;
41 }
42 
43 int main()
44 {
45     int t, n;
46     scanf("%d", &t);
47     int k=0;
48     while(t--)
49     {
50         if(k==0)
51             k++;
52         else
53             printf("
");
54         memset(dis, 0, sizeof(dis));
55         memset(map, 0, sizeof(map));
56         memset(visit, 0, sizeof(visit));
57         
58         scanf("%d", &n);
59         for(int i=1; i<=n; i++)
60             for(int j=1; j<=n; j++)
61             {
62                 map[i][j] = INF; 
63                 scanf("%d", &map[i][j]);
64             }
65         int cnt = prim(n, 1);
66         sort(ans, ans+cnt);
67         printf("%d
", ans[cnt-1]);
68     }
69     return 0;
70 }
原文地址:https://www.cnblogs.com/dominjune/p/4506756.html