poj1258prim算法
2015-10-31 11:18
681 查看
/*poj 1258 *题意:有若干个农场,现需要将各个农场用光纤连接起来,各个农场之间连接的光纤长度也许不同, *要求求出使得将所有农场连接起来的最短光线长度 *算法分析:使用矩阵将各个农场之间的光线长度存储起来、然后使用prim算法 */ #include <stdio.h> #include <string.h> #define MaxInt 0x3f3f3f3f #define N 110 //创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问 int map ,low ,visited ; int n; int prim() { int i,j,pos,min,result=0; memset(visited,0,sizeof(visited)); //从某点开始,分别标记和记录该点 visited[1]=1;pos=1; //第一次给low数组赋值 for(i=1;i<=n;i++) if(i!=pos) low[i]=map[pos][i]; //再运行n-1次 for(i=1;i<n;i++) { //找出最小权值并记录位置 min=MaxInt; for(j=1;j<=n;j++) if(visited[j]==0&&min>low[j]) { min=low[j];pos=j; } //最小权值累加 result+=min; //标记该点 visited[pos]=1; //更新权值 for(j=1;j<=n;j++) if(visited[j]==0&&low[j]>map[pos][j]) low[j]=map[pos][j]; } return result; } int main() { int i,v,j,ans; while(scanf("%d",&n)!=EOF) { //所有权值初始化为最大 memset(map,MaxInt,sizeof(map)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&v); map[i][j]=map[i][j]=v; } ans=prim(); printf("%d\n",ans); } return 0; }
相关文章推荐
- sublime text 全局搜索
- 高并发与锁(二)
- 项目视频界面横屏返回竖屏,oncreate执行2次
- linux服务开机启动
- 免秘钥SSH登陆,切记切换用户
- [TwistedFate]实例变量可⻅度、⽅法
- 浙大PAT(PAT Basic Level) 1045—— 快速排序
- iOS线程报错
- winfrom 中boderstyle 设置为none后不能移动的问题
- 安装mysql
- Spring Security的核心拦截器
- slf4j+log4j
- 数据库-除
- 数据挖掘——总结 【未完待续】
- innocence
- git访问https
- LDAP
- MapReduce的简单讲解
- 一句话,大数据算法【更新ing】
- Page Rank