prim 算法求最小生成树

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20712    Accepted Submission(s): 9213

Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N为0时,输入结束,该用例不被处理。
 
Output
对每个测试用例,在1行里输出最小的公路总长度。
 
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
 
Sample Output
3
5

Hint

Hint

Huge input, scanf is recommended.

Source
 
Recommend
JGShining

 #include<stdio.h>
#include<string.h>
#define max 100000000
int map[][],sum,min;// map[i][j] 记录从点 i 到点 j 的距离 !
int main()
{
int n,m,i,x,y,dis,j,flag,visit[];
while(~scanf("%d",&n)&&n!=)
{ m=(n*(n-))/;
memset(map, , sizeof(map));//数组清零
memset(visit,,sizeof(visit));
for(i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&dis);
map[x-][y-]=map[y-][x-]=dis;
}
for(i=;i<n;i++)
map[i][i]=max;//建图完成 !
visit[]=; sum=;
for ( i=; i<n; i++)//prim 算法求最小生成树
{
min= ;
for ( j=; j<n; j++)
{
if (!visit[j] && map[][j] < min)
{
min = map[][j];
flag = j;
}
}
sum += min;
visit[flag] = ;
for ( j=; j<n; j++)
{
if (!visit[j] && map[][j] > map[flag][j])
{
map[][j] = map[flag][j];
}
}
}
printf("%d\n",sum);
}
return ;
}

prim写成函数的方式,更容易理解。

 #include<stdio.h>
int map[][],visit[];
int length[];
int getmin(int n)
{
int i,min;
for(i=;i<=n;i++)
{
if(visit[i]==)
{
min=i;
break;
}
}
for(i++;i<=n;i++)
{
if(visit[i]==&&length[min]>length[i])
min=i;
}
return min;
}
int prim(int n)
{
int i,j;
int min;
int sum;
for(i=;i<=n;i++)
{
visit[i]=;
length[i]=map[][i];
}
visit[]=;
sum=;
for(i=;i<=n;i++)
{
min=getmin(n);
visit[min]=;
sum+=length[min];
for(j=;j<=n;j++)
{
if(visit[j]==)
{
if(map[min][j]<length[j])
{
length[j]=map[min][j];
}
}
}
}
return sum;
}
int main()
{
int n, m;
int i;
int min;
int u, v, cost;
while (scanf("%d", &n) != EOF && n != )
{
m = n * (n - ) / ;
for (i = ; i <= n; i++)
map[i][i] = ;
for (i = ; i < m; i++)
{
scanf("%d%d%d", &u, &v, &cost);
map[u][v] = cost;
map[v][u] = cost; }
min = prim(n);
printf("%d\n", min);
}
return ;
}

浓缩版:

#include<stdio.h>
#include<string.h>
#define MAX 100000
int map[][],v[];
int prim(int n)//最好的prim的模板。
{
int k[],i,j;
int min,sum=,flag,count=;
memset(k,,sizeof(k));
memset(v,,sizeof(v));
for(i=;i<=n;i++)
k[i]=map[][i];
for(i=;i<=n;i++)
{
min=MAX;
for(j=;j<=n;j++)
{
if(min>k[j]&&v[j]==)
{
min=k[j];
flag=j;
}
}
sum+=min;
v[flag]=;
for(j=;j<=n;j++)
if(v[j]==&&k[j]>map[flag][j]&&flag!=j)
k[j]=map[flag][j];
}
return sum;
}
int main()
{
int n,m,i,j,p,q,r,min;
while(~scanf("%d",&n)&&n!=)
{
m=n*(n-)/;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
if(i==j) map[i][j]=;
else
map[i][j]=MAX;
}
for(i=;i<m;i++)
{
scanf("%d%d%d",&p,&q,&r);
map[p][q]=map[q][p]=r;
}
min=prim(n);
printf("%d\n",min);
}
return ;
}

HDU-1233 还是畅通工程 (prim 算法求最小生成树)的更多相关文章

  1. hdu 1233 还是畅通工程 (prim, kruskal)

    还是畅通工程Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. hdu 1233 还是畅通project(kruskal求最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  3. HDU.1233 还是畅通工程(Prim)

    HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...

  4. Kruskal和Prim算法求最小生成树

    Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...

  5. HDU 1233 还是畅通工程(Kruskal算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)   ...

  6. hdu 1233 还是畅通工程 (最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    ...

  7. hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)

    还是畅通工程 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  8. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

    还是畅通工程                                                                            Time Limit: 4000/2 ...

  9. HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

随机推荐

  1. asp.net:用类来后台绑定数据源

    //封装成一个 using System;using System.Collections.Generic;using System.Linq;using System.Web;using Syste ...

  2. 记:mysql 连接超时解决办法

    错误描述:Timeout in IO operation 原连接字符串为:Server=182.180.50.118;port=3306;Database=test;Uid=root;Pwd=123; ...

  3. jQuery动态效果实例

    jQuery常见的动态效果: 隐藏/显示效果: 1.(1):隐藏,显示:通过 jQuery,使用 hide() 和 show() 方法可以用来隐藏和显示 HTML 元素. (2):隐藏/显示的速度: ...

  4. HDU 4706 Children's Day(简单模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4706 题目大意:要用‘a’-‘z’ 26个小写字母输出倒着写得字母'N'的形状,例如 a ebdfc ...

  5. windows下使用xampp一键安装apache+php运行环境

    感谢浏览,欢迎交流=.= 想为我老爸开发一套库存管理系统,借此机会打算使用下ext+php+apache+linux环境尝尝鲜. 为了在windows搭建本地开发测试环境,官网下载xampp,一键安装 ...

  6. Kali linux网络配置

    Kali linux 安装完成后,需要对其网络进行配置.使用DHCP服务是配置网卡最简单的方法之一,但渗透测试时通常不会这样做,因为系统会被记录在DHCP服务器的数据库中. 1  动态DHCP方式 配 ...

  7. [转]Vim 复制粘贴探秘

    Vim作为最好用的文本编辑器之一,使用vim来编文档,写代码实在是很惬意的事情.每当学会了vim的一个新功能,就会很大地提高工作效率.有人使用vim几十年,还没有完全掌握vim的功能,这也说明了vim ...

  8. C#如何使用ES

    Elasticsearch简介 Elasticsearch (ES)是一个基于 Lucene 的开源搜索引擎,它不但稳定.可靠.快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的. Elas ...

  9. iOS开发 - NSBundle, NSDevice, NSLocale

    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到 ...

  10. nump中的为随机数产生器的seed

    在python的程序中,发现了如下的伪随机数产生的代码 rng = numpy.random.RandomState(23355) arrayA = rng.uniform(0,1,(2,3)) 该段 ...