hihocoder 第二十九周 堆优化的Prim算法
又深刻理解了一遍prim和dijkstra算法,感觉蛮棒的~
第一次自己用邻接表写,just soso~ 啊哈~
一开始被优先队列,重载运算符给卡住了~ 蛋疼~
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<map> 9 #include<iomanip> 10 #include<climits> 11 #include<string.h> 12 #include<stdlib.h> 13 #include<vector> 14 #define INF 1e7 15 #define MAXN 111111 16 using namespace std; 17 18 19 struct node{ 20 int v, w; 21 bool operator < (const node& a) const { 22 return w > a.w; 23 } 24 }; 25 26 vector<node> G[MAXN]; 27 bool vis[MAXN]; 28 int dis[MAXN]; 29 int n, m; 30 priority_queue<node> q; 31 32 33 void Prim(node s) 34 { 35 memset(vis, 0, sizeof(vis)); 36 for (int i = 0; i <= n; ++i) dis[i] = INF; 37 while (!q.empty()) q.pop(); 38 int ans = 0; 39 q.push(s); 40 while (!q.empty()) { 41 node u = q.top(); 42 q.pop(); 43 if (vis[u.v]) continue; 44 vis[u.v] = true; 45 ans += u.w; 46 //cout << ans << endl; 47 for (int i = 0; i < G[u.v].size(); ++i) { 48 int v = G[u.v][i].v; 49 if (!vis[v] && dis[v] > G[u.v][i].w) { 50 dis[v] = G[u.v][i].w; 51 q.push({ v, dis[v] }); 52 } 53 } 54 } 55 cout << ans << endl; 56 } 57 58 59 int main() 60 { 61 int a, b, c; 62 cin >> n >> m; 63 for (int i = 1; i <= m; ++i) { 64 cin >> a >> b >> c; 65 G[a].push_back({ b, c }); 66 G[b].push_back({ a, c }); 67 } 68 Prim({ 1, 0 }); 69 //system("pause"); 70 return 0; 71 }