您的位置:首页 > 其它

[MST_prim] PKU 1258 Agri-Net

2012-08-07 11:30 302 查看
prim入门练习题。

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相对较简洁,适用于稀疏图。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: