prim
1 int n; 2 int weight; 3 int g[MAXN][MAXN]; 4 int vis[MAXN]; 5 int dis[MAXN]; 6 7 8 void prim(int v0){ 9 int pos = v0; 10 for(int i = 1; i <= n; i++){ 11 dis[i] = g[v0][i]; 12 } 13 vis[pos] = 1; 14 for(int i = 1; i < n; i++){ 15 int mins = INF; 16 for(int j = 1; j <= n; j++){ 17 if(!vis[j] && dis[j] < mins){ 18 pos = j; 19 mins = dis[j]; 20 } 21 } 22 weight += mins; 23 vis[pos] = 1; 24 for(int j = 1; j <= n; j++){ 25 if(!vis[j] && g[pos][j] < dis[j]){ 26 dis[j] = g[pos][j]; 27 } 28 } 29 } 30 }
1 #include <iostream> 2 #include <queue> 3 #include <string.h> 4 using namespace std; 5 #define M 1000 6 int g[M][M]; 7 int n, cnt; 8 int node[M]; 9 int weight; 10 11 void init(){ 12 memset(g,0,sizeof(g)); 13 memset(node,0,sizeof(node)); 14 } 15 16 struct Edge{ 17 int from,to,w; 18 }; 19 20 bool operator < (const Edge &a, const Edge &b){ 21 return a.w > b.w; 22 } 23 24 int prim(int start){ 25 node[start] = 1; 26 priority_queue<Edge> q; 27 for(int i = 0; i < n; i++){ 28 if(0 != g[start][i]){ 29 Edge e; 30 e.from = start; 31 e.to = i; 32 e.w = g[start][i]; 33 q.push(e); 34 } 35 } 36 while(!q.empty()){ 37 Edge cmp = q.top(); 38 q.pop(); 39 if(node[cmp.from] == 0 || node[cmp.to] == 0){ 40 node[cmp.from] = node[cmp.to] = 1; 41 weight += cmp.w; 42 } 43 for(int i = 0; i < n; i++){ 44 if(node[i] == 0 && g[cmp.to][i] != 0){ 45 Edge add; 46 add.from = cmp.to; 47 add.to = i; 48 add.w = g[cmp.to][i]; 49 q.push(add); 50 } 51 } 52 } 53 } 54 int main(){ 55 init(); 56 cin >> n >> cnt; 57 for(int i = 0; i < cnt; i++){ 58 int a, b, w; 59 cin >> a >> b >> w; 60 g[a][b] = g[b][a] = w; 61 } 62 prim(0); 63 cout << weight << endl; 64 return 0; 65 }