1、mst 没有堆优化的prim算法
//原题链接: http://hihocoder.com/problemset/problem/1097
1 //原题链接: http://hihocoder.com/problemset/problem/1097 2 3 #include <iostream> 4 #include <cstdio> 5 #include <set> 6 #include <cstring> 7 #include <climits> 8 using namespace std; 9 10 int gra[1010][1010]; 11 int vis[1010]; 12 int min_dis[1010]; //图上的每个节点到mst的距离 13 14 int main() { 15 memset(gra, 0x7f, sizeof(gra)); 16 memset(vis, 0, sizeof(vis)); 17 memset(min_dis, 0x7f, sizeof(min_dis)); 18 int n; 19 scanf("%d", &n); 20 for (int i = 0; i < n; ++i) { 21 for (int j = 0; j < n; ++j) { 22 scanf("%d", &gra[i][j]); 23 } 24 } 25 //初始化 26 vis[0] = 1; 27 int left = n - 1; 28 min_dis[0] = 0; //第0个节点就是树开始计算的第一个结点 29 for (int i = 1; i < n; ++i) { 30 min_dis[i] = gra[0][i]; 31 } 32 33 int min_cost = 0; 34 35 while (left) { 36 int vertex = 1, minn_dis = INT_MAX; 37 //从没有访问过的所有节点中找出距离树的距离最小的一个. 38 for (int i = 0; i < n; ++i) { 39 if (!vis[i] && min_dis[i] < minn_dis) { 40 vertex = i, minn_dis = min_dis[i]; 41 } 42 } 43 vis[vertex] = true; 44 min_cost += minn_dis; 45 left--; 46 //printf("%d : vertex: %d; minn_dis[%d] \n", n - left - 1, vertex, minn_dis); 47 48 //把找到的新的点加到mst中,然后更新每个没有访问过的结点到mst的距离 49 for (int i = 0; i < n; ++i) { 50 if (!vis[i] && min_dis[i] > gra[vertex][i]) { 51 min_dis[i] = gra[vertex][i]; 52 } 53 } 54 } 55 printf("%d\n", min_cost); 56 return 0; 57 }