POJ 1258 Agri-Net

最近开始做图论题,先从MST入手,MST最常用的两个算法就是Prim和Kruskal+Union-Find Set了。这道题由于是稠密图,所以选用Prim更适合一些。简单的模板题,只是为了熟悉下Prim的写法,就不做过多的解释了。

 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 using namespace std;
5
6 #define N 101
7
8 int n,adj[N][N],visit[N],lowcost[N];
9
10 int prim()
11 {
12 memset(visit,0,sizeof(visit));
13 visit[1] = 1;
14 int pos = 1;
15 for(int i=2;i<=n;i++)
16 lowcost[i] = adj[pos][i];
17 int ans = 0;
18 for(int i=1;i<n;i++)
19 {
20 int min = 0x3f3f3f3f;
21 for(int j=1;j<=n;j++)
22 if(!visit[j] && lowcost[j] < min)
23 {
24 min = lowcost[j];
25 pos = j;
26 }
27 ans += min;
28 visit[pos] = 1;
29 for(int j=1;j<=n;j++)
30 if(!visit[j] && adj[pos][j] < lowcost[j])
31 lowcost[j] = adj[pos][j];
32 }
33 return ans;
34 }
35
36 int main()
37 {
38 while(scanf("%d",&n) != EOF)
39 {
40 for(int i=1;i<=n;i++)
41 for(int j=1;j<=n;j++)
42 scanf("%d",&adj[i][j]);
43 printf("%d\n",prim());
44 }
45 return 0;
46 }



题目链接:http://poj.org/problem?id=1258

posted @ 2012-03-05 14:50  HanTQ  阅读(162)  评论(0编辑  收藏  举报