【图论】基础算法实现笔记

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 }
View Code

猜你喜欢

转载自www.cnblogs.com/zhangwanying/p/9431761.html
今日推荐