POJ11251---Jungle Roads(最小生成树)
来源:互联网 发布:linux配置多个ip地址 编辑:程序博客网 时间:2024/05/21 06:34
【题目来源】:https://cn.vjudge.net/problem/POJ-1251
【题意】
这道题很水啦,只不过我新学了prim算法,就拿来练手啦。
这道题题意是在给出的边里选权值和最小的边连通整个村庄。
【思路】
简单的最小生成树模型。
下面先说一下我对prim算法的理解(博主去盗图啦):
看这个图,假设我以点D为起点(谁是起点都无所谓的),那么选一条离D点最近的路,当然是DA(方向什么的无所谓。。。),那么现在我手里有两个点,一个是D,一个是A,接下来,就是和最短路求法不一样的地方,我来解释一下,比如迪切斯特拉算法,单源最短路径,因为已经选定了一条边,那么如果是迪切斯特拉算法的话,会拿着这条边去更新其他的边,比如,会比较到底是DB长还是AD+AB长,这样去更新,而prim算法就不一样啦,这个算法只求能够连通,并且用于连接的两点之间是最优的(最省钱的),(最短路求得是一个点到另外一个点的最短路,想一下),所以,prim算法在选出一个点之后,会有这么一个操作:
for(int j=1;j<=n;j++)
{
if(!vis[j]&&d[j]>a[pos][j])
{
d[j]=a[pos][j];
}
}.
再看一下图:
假设已经选出了A点,那么AD高亮显示:
这个时候,根据那个代码,会有这么一个操作(只模拟一组)
当更新到B点时,判断一下,是DB短(可以预先赋为无穷大)还是AB更短,根据图片,得到是AB更小,那么d数组里的值就会变化,变得更小。
他不像最短路,非要有一个起点,prim算法只要标记过了一个点,那么这个点和之前的点都是起点,就看哪个更近了。
这里是百度百科:prim算法
【代码一】
#include<cstdio>#include<cstring>#include<algorithm>#define INF 100000int a[30][30];int n;int d[30];bool vis[30];void prim(){ for(int i=1;i<=n;i++) d[i]=a[1][i];//初始化,也可以全设为INF vis[1]=1; int sum=0; for(int i=2;i<=n;i++) { int minn=INF,pos=0; for(int j=1;j<=n;j++)//选出一个最近的点 { if(!vis[j]&&d[j]<minn) { minn=d[pos=j]; } } sum+=minn; vis[pos]=1; for(int j=1;j<=n;j++)//更新 if(!vis[j]&&d[j]>a[pos][j]) d[j]=a[pos][j]; } printf("%d\n",sum);}int main(){ while(~scanf("%d",&n)&&n) { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=i==j?0:INF; getchar(); for(int i=1; i<n; i++) { char s,t; int num; scanf(" %c %d",&s,&num); int l=s-'A'+1; for(int i=0; i<num; i++) { int vi; scanf(" %c %d",&t,&vi); int r=t-'A'+1; a[l][r]=a[r][l]=vi; } } prim(); }}
【代码二】
#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int pre[30];struct pp{ int x,y,z;}a[100];bool cmp(pp c,pp d){ return c.z<d.z;}int find(int x){ if(x!=pre[x]) { int fx=find(pre[x]); pre[x]=fx; } return pre[x];}int main(){ int n; while(~scanf("%d",&n)&&n) { for(int i=1; i<=n; i++) pre[i]=i; int l=0; for(int i=1; i<n; i++) { char s; int num; scanf(" %c%d",&s,&num); int st=s-'A'+1; for(int j=0;j<num;j++) { char t; scanf(" %c%d",&t,&a[l].z); a[l].x=st; a[l].y=t-'A'+1; l++; } } sort(a,a+l,cmp); int num=0,money=0; for(int i=0;i<l;i++) { int fa=find(a[i].x); int fb=find(a[i].y); if(fa!=fb) { num++; money+=a[i].z; if(num>=n-1) break; pre[fa]=fb; } } printf("%d\n",money); }}
- POJ11251---Jungle Roads(最小生成树)
- Jungle Roads(最小生成树)
- Jungle Roads 最小生成树(kruskal)
- Jungle Roads(最小生成树)
- Jungle Roads 最小生成树
- zoj 1406 Jungle Roads(最小生成树))
- HDU1301 Jungle Roads(最小生成树prim)
- poj 1251Jungle Roads (最小生成树:prime+krusual)
- Jungle Roads(最小生成树+并查集)
- HDU 1301 Jungle Roads 最小生成树(简单)
- poj 1251 Jungle Roads(最小生成树)
- poj 1251 Jungle Roads(最小生成树)
- hdu 1301 Jungle Roads (基础最小生成树)
- HDU 1301 Jungle Roads (最小生成树)kruskal
- Jungle Roads(prime——最小生成树)
- poj 1251 Jungle Roads(最小生成树,普里姆算法)
- POJ 1251 Jungle Roads(最小生成树)
- HDOJ 题目1301 Jungle Roads(最小生成树,prim)
- 两种yarn集群提交方式
- 【Mysql】设备首页统计展示
- 关于基线版本
- 保留小数点2位,四舍五入,java
- Sql server高级查询
- POJ11251---Jungle Roads(最小生成树)
- Android音频框架笔记
- HttpServletRequestWrapper 编码问题
- LeetCode刷题记录 First Missing Positive
- BASE64加密与解密
- 键盘事件keydown,keypress,keyup区别
- 递归函数
- 微店 Android 插件化实践
- 小Tip之int...