poj 1258 Agri-Net prim模板 prim与dijkstra的区别

很裸地求最小生成树的题目。题意就不多说了,最重要的就是记录一下学会了prim算法。

初学prim,给我的第一感觉就是和dijkstra好像啊,感觉两者的区别还是有的:

1:prim是求最小生成树的算法。

  dijkstra是求最短路的算法。

2:prim中dis保存的是未加入集合的点,加入集合需要的代价,而中的代价是其他变量保存的。

  dijkstra中dis保存的是从起点到当前点所花费的最小代价。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <iostream>
 7 using namespace std;
 8
 9 const int INF = 0x3f3f3f3f;
10 const int maxn = 105;
11 //map记录路径,vis记录是否加入集合,dis记录未加入集合的点与集合的最短距离
12 int map[maxn][maxn], vis[maxn], dis[maxn], n;
13
14 int prim ()
15 {
16     int i, sum;
17     memset(vis, 0, sizeof(vis));//标记所有的点都在集合外
18     sum = 0;//总花费记为0
19     vis[1] = 1;//把1当成起始集合
20     for (i=2; i<=n; i++)//初始化dis
21         dis[i] = map[1][i];
22     for (int j=1; j<n; j++)
23     {//因为已经加入集合了一个点,所以只需循环n-1次
24         int min = INF, index;
25         for (i=1; i<=n; i++)//寻找加入集合的最优点
26             if (!vis[i] && dis[i]<min)
27             {
28                 min = dis[i];
29                 index = i;
30             }
31             sum += min;//把最优点加入集合
32             vis[index] = 1;
33          for (i=1; i<=n; i++)//对未加入集合的点加入到集合所用的花费进行优化
34                 if (!vis[i] && dis[i]>map[index][i])
35                 dis[i] = map[index][i];
36     }
37     return sum;
38 }
39 int main ()
40 {
41     int s;
42     while (scanf ("%d", &n)!= EOF)
43     {
44         for (int i=1; i<=n; i++)
45             for (int j=1; j<=n; j++)
46             {
47                 scanf ("%d", &s);
48                 map[i][j] = s;
49             }
50         printf ("%d\n", prim ());
51     }
52     return 0;
53 }
时间: 2024-10-28 02:30:47

poj 1258 Agri-Net prim模板 prim与dijkstra的区别的相关文章

POJ 1258:Agri-Net(最小生成树&amp;&amp;prim)

Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38918   Accepted: 15751 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

[POJ 1258] Agri-Net 最小生成树模板 Prim #include #define INF 0x3f3f3f3f using namespace std; int mp[501][501]; int dis[501]; bool vis[501]; int n; int Prim() { int i,j,w,p,sum = 0; memset(dis,-1,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[1] = 0; for(i = 0

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最小生成树)

最小生成树模板题 #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)

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算法)

题意: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

最小生成树(kruskal模版 Prim模板)

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2144&cid=1186 最小生成树,最重要的是了解思想 稠密图用Prim,稀疏图用Kruskal K(每次找最小的边连接,一条边连接两个点,所以单路就可以了) 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int bin[110]; 5 struct node 6 { 7 int

各种最小生成树。 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