[MST_prim] PKU 1258 Agri-Net
2012-08-07 11:30
302 查看
prim入门练习题。
prim的流程如下:
// 清空顶点集;
任选一个点u作为起点,加入顶点集,从u出发选一条最小边(u, v),将v加入顶点集,重复直到所有点都进入顶点集。
其中最小边可以用堆来做,还可以用邻接表加速(这里嫌麻烦)。
kruskal相对较简洁,适用于稀疏图。
prim的流程如下:
// 清空顶点集;
任选一个点u作为起点,加入顶点集,从u出发选一条最小边(u, v),将v加入顶点集,重复直到所有点都进入顶点集。
其中最小边可以用堆来做,还可以用邻接表加速(这里嫌麻烦)。
# include <cstdio> # include <queue> using namespace std; typedef pair<int, int> pii; # define N (100 + 5) # define INF 0x7FFFFFFF int n; int g ; int prim(void) { priority_queue <pii, vector<pii>, greater<pii> > Q; int key ; char vis ; for (int i = 1; i <= n; ++i) { vis[i] = 0; key[i] = (i==1 ? 0:INF); } Q.push(make_pair(key[1], 1)); int ans = 0; while (!Q.empty()) { int u = Q.top().second; Q.pop(); if (!vis[u]) ans += key[u]; vis[u] = 1; for (int i = 1; i <= n; ++i) if (!vis[i] && g[u][i] < key[i]) { key[i] = g[u][i]; Q.push(make_pair(key[i], i)); } } return ans; } void read_graph(void) { for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) g[i][j] = INF; for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) { int x; scanf("%d", &x); if (g[i][j] > x) g[j][i] = g[i][j] = x; } } int main() { while (~scanf("%d", &n)) { read_graph(); printf("%d\n", prim()); } return 0; }
kruskal相对较简洁,适用于稀疏图。
相关文章推荐
- pku 1258 Agri-Net(标准prim)
- MST pku 1258 Agri-Net
- POJ 1258 Agri-Net (prim求MST)
- (最小生成树-Prim)PKU-1258 Agri-Net
- Agri-Net (poj 1258 最短路+prim)
- POJ 1258 Agri-Net (最小生成树/Prim)
- poj 1258 Agri-Net(prim求最小生成树)
- acm pku 1258 Agri-Net的Prim算法实现
- POJ 1258 Agri-Net【MST】
- ACM-MST(最小生成树)之Agri-Net——poj1258
- Agri-Net (poj 1258 最短路+prim)
- poj&nbsp;1258&nbsp;Agri-Net(prim)
- POJ 1258 Agri-Net(Prim算法求解MST)
- POJ 1258 Agri-Net 【MST,Prime算法】
- POJ1258——Prim——Agri-Net
- Agri-Net - poj 1258 (Prim 算法)
- poj 1258 Agri-Net (最小生成树 prim)
- POJ 1258 Agri-Net 最小生成树 prim
- poj 1258 Agri-Net Prim + kruskal
- POJ 1258 Agri-Net (prim 最小生成树)