[Prim]Poj 1258 Agri-Net

利用Prim算法求最小生成树,其工作原理与Dijkstra相似。

这棵树从一个任意的根节点r开始,一只长大到覆盖V中的所有顶点为止。

算法每一步加入的边都必须是使树的总权重增加量最小的边。

代码转载自:http://www.cnblogs.com/Veegin/archive/2011/04/29/2032388.html

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MaxInt 0x3f3f3f3f
 4 #define N 110
 5 //创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问
 6 int map[N][N],low[N],visited[N];
 7 int n;
 8
 9 int prim()
10 {
11     int i,j,pos,min,result=0;
12     memset(visited,0,sizeof(visited));
13     //从某点开始,分别标记和记录该点
14     visited[1]=1;pos=1;
15     //第一次给low数组赋值
16     for(i=1;i<=n;i++)
17         if(i!=pos)
18             low[i]=map[pos][i];
19     //再运行n-1次
20     for(i=1;i<n;i++){
21     //找出最小权值并记录位置
22          min=MaxInt;
23     for(j=1;j<=n;j++){
24          if(visited[j]==0&&min>low[j]){
25             min=low[j];pos=j;
26         }
27     }
28
29     //最小权值累加
30     result+=min;
31     //标记该点
32     visited[pos]=1;
33     //更新权值
34     for(j=1;j<=n;j++)
35         if(visited[j]==0&&low[j]>map[pos][j])
36             low[j]=map[pos][j];
37     }
38     return result;
39 }
40
41 int main()
42 {
43     int i,v,j,ans;
44     while(scanf("%d",&n)!=EOF)
45     {
46     //所有权值初始化为最大
47         memset(map,MaxInt,sizeof(map));
48         for(i=1;i<=n;i++)
49             for(j=1;j<=n;j++)
50             {
51                 scanf("%d",&v);
52                 map[i][j]=map[i][j]=v;
53             }
54             ans=prim();
55             printf("%d\n",ans);
56     }
57     return 0;
58 }
时间: 2024-10-14 02:07:17

[Prim]Poj 1258 Agri-Net的相关文章

POJ 1258 Agri-Net (最小生成树+Prim)

Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39820   Accepted: 16192 Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He nee

poj 1258 Agri-Net (最小生成树 prim)

Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39499   Accepted: 16017 Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He nee

POJ 1258 Agri-Net (prim最小生成树)

最小生成树模板题 #include<bits/stdc++.h> using namespace std; int n,a; int dist[120],m[120][120]; void prim() {     bool p[1020];     for(int i=2;i<=n;i++)     {         p[i]=false;         dist[i]=m[1][i];     }     dist[1]=0,p[1]=true;     for(int i=1;

POJ 1258 Agri-Net(Prim算法)

题意:n个农场,求把所有农场连接起来所需要最短的距离. 思路:prim算法 课本代码: //prim算法 #include<iostream> #include<stdio.h> #include<cstring> using namespace std; int n; int tot; int v[150][150]; int dist[150];//存 节点到树 的最小距离 bool use[150];//标记节点是否存在 int main(){ while(sca

各种最小生成树。 HDU 1863 HDU 1301 POJ 1258

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18811    Accepted Submission(s): 7981 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出

poj 1258 Agri-Net 解题报告

题目链接:http://poj.org/problem?id=1258 题目意思:给出 n 个 farm,每个farm 之间通过一定数量的fiber 相连,问使得所有farm 直接或间接连通的 最少 fiber 数是多少. 赤裸裸的最小生成树,用prim做的. 有个地方写错,wa 了 几次. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int farm_num = 10000

rwkj 1505 poj 1258 10.1.5.253 1505

#include <iostream>// poj 1258 10.1.5.253 1505using namespace std; #define N 105 // 顶点的最大个数 (多写 int a[N][N],low[N],n,ans;int min(int x,int y){ return x<y?x:y; } void prim(int u0) { int i,j,m,k; ans=0; // for (i=1;i<n;i++) low[i]=a[u0][i]; // l

[2016-04-14][POJ][1258][Agri-Net]

时间:2016-04-14 20:36:55 星期四 题目编号:[2016-04-14][POJ][1258][Agri-Net] 题目大意:求最小生成树 分析:直接prim算法 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100 + 10 ; int g[maxn][maxn],vis[maxn],lowc[maxn]; int

poj 1258 Agri-Net(最小生成树果题)

题目链接:http://poj.org/problem?id=1258 Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He needs your help, of course. Farmer John ordered a high speed