您的位置:首页 > 其它

hihocoder 第二十九周 堆优化的Prim算法

2015-02-13 00:16 197 查看
又深刻理解了一遍prim和dijkstra算法,感觉蛮棒的~

第一次自己用邻接表写,just soso~ 啊哈~

一开始被优先队列,重载运算符给卡住了~ 蛋疼~

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#include<climits>
#include<string.h>
#include<stdlib.h>
#include<vector>
#define INF 1e7
#define MAXN 111111
using namespace std;

struct node{
int v, w;
bool operator < (const node& a) const {
return w > a.w;
}
};

vector<node> G[MAXN];
bool vis[MAXN];
int dis[MAXN];
int n, m;
priority_queue<node> q;

void Prim(node s)
{
memset(vis, 0, sizeof(vis));
for (int i = 0; i <= n; ++i) dis[i] = INF;
while (!q.empty())  q.pop();
int ans = 0;
q.push(s);
while (!q.empty()) {
node u = q.top();
q.pop();
if (vis[u.v]) continue;
vis[u.v] = true;
ans += u.w;
//cout << ans << endl;
for (int i = 0; i < G[u.v].size(); ++i) {
int v = G[u.v][i].v;
if (!vis[v] && dis[v] > G[u.v][i].w) {
dis[v] = G[u.v][i].w;
q.push({ v, dis[v] });
}
}
}
cout << ans << endl;
}

int main()
{
int a, b, c;
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
cin >> a >> b >> c;
G[a].push_back({ b, c });
G[b].push_back({ a, c });
}
Prim({ 1, 0 });
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: