POJ 1258 Agri-Net(最小生成树-Prim)
2015-08-24 09:06
537 查看
Description
有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输出安装光纤的总距离
Input
第一行一个整数n表示农场个数(3<=n<=100),然后是n个农场的距离矩阵
Output
输出安装光纤的最小总距离
Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
Sample Output
28
Solution
最小生成树,因为给出了一个二维矩阵代表他们的距离,直接算prim就行了
Code
有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输出安装光纤的总距离
Input
第一行一个整数n表示农场个数(3<=n<=100),然后是n个农场的距离矩阵
Output
输出安装光纤的最小总距离
Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
Sample Output
28
Solution
最小生成树,因为给出了一个二维矩阵代表他们的距离,直接算prim就行了
Code
#include<stdio.h> #include<string.h> #define INF 100000000 #define maxn 105 int n,sum;//n是顶点数,sum是结果 int map[maxn][maxn];//map表示距离矩阵 int used[maxn];//顶点i是否包含几何X中 int dis[maxn];//从集合X出发的边到每个顶点的最小权值 void Prim() { int i,j,k,min; memset(used,0,sizeof(used));//初始化 used[1]=1;//从顶点1出发 for(i=1;i<=n;i++)//从顶点1出发的边到每个顶点的最小权值即顶点1到各顶点的距离 dis[i]=map[1][i]; for(i=1;i<n;i++) { min=INF; for(j=1;j<=n;j++)//从不属于X的定点选取从X到其权值最小的顶点 { if(!used[j]&&dis[j]<min) { min=dis[j]; k=j; } } used[k]=1;//把定点k加到X中 sum+=min;//把边的长度加到结果中 for(j=1;j<=n;j++) if(!used[j]&&dis[j]>map[k][j]) dis[j]=map[k][j]; } } int main() { int i, j; while(scanf("%d",&n)!=EOF) { sum = 0; for(i=1; i<=n; i++) for(j=1; j<=n; j++) scanf("%d", &map[i][j]); Prim(); printf("%d\n",sum); } }
相关文章推荐
- c#读取文件一行一行读取
- zookeeper集群环境的搭建
- 【自动内存管理(ARC)】
- LA 3027 并查集
- ECMAScript之操作符重点小解
- abstract的方法是否可同时是static 是否可同时是native 是否可同时
- UIScrollView
- php实现递归的三种基本方式
- MySQL的安装过程
- Android开发初识Volley的基本用法
- arcgis发布几何服务(geometryService)
- 第二十三天 TextView、Button
- 分享让人折服的优秀代码基因
- 九度oj1514数值的整数次方
- leetcode题解
- Hibernate的三种缓存机制
- Ubuntu之常用命令
- POJ 1250 Tanning Salon(简单模拟)
- 【Dijkstra+邻接表求次短路】HDOJ How Many Paths Are There 3191
- 基于注解的 Spring MVC 简单入门