HDU 1879 还是prim最小生成树、
2016-02-27 20:01
246 查看
#include<stdio.h> #include<math.h> #include<string.h> const int qq=100+10,MAX=1e7; int vis[qq]; int lowcost[qq][qq]; int minimum[qq]; int n; void prim() { int minx,k; int sum=0; vis[1]=1; for(int i=0;i<=n+1;++i) minimum[i]=lowcost[1][i]; for(int i=1;i<n;++i){ minx=MAX; for(int j=1;j<=n;++j) if(!vis[j] && minx > minimum[j]){ minx=minimum[j]; k=j; } vis[k]=1; sum+=minx; for(int l=1;l<=n;++l) if(!vis[l] && minimum[l] > lowcost[k][l]) minimum[l]=lowcost[k][l]; } printf("%d\n",sum); } int main() { while(~scanf("%d",&n)&&n){ for(int i=0;i<=n+1;++i) minimum[i]=MAX; for(int j,i=0;i<=n+1;++i) for(j=0;j<=n+1;++j) lowcost[i][j]=MAX; for(int i=0;i<=n+1;++i) vis[i]=0; int i,j,cost,mark; for(int l=1;l<=n*(n-1)/2;++l){ scanf("%d %d %d %d",&i,&j,&cost,&mark); if(mark==1){ lowcost[i][j]=lowcost[j][i]=0; //已经存在路径的话直接权值为0 } else lowcost[i][j]=lowcost[j][i]=(i==j)?0:cost; } prim(); } }
最开始调试的时候好像memset函数使用错误,我把第二个参数写的MAX开始RE或者PE, 最后迫于无奈,直接用循环来初始化
后来标记已经存在的路径vis分别标记i,j为1;这样我就分了三种情况讨论第一是已经标记过的点位0个,第二是已经标记过的点位n个,0~n之间就是第三种情况,调了半天发现WA了几次、最后还是直接套用prim算法来的准确,所以就说已存在路径的值直接赋值0好了
相关文章推荐
- Redis主从复制
- 4G(LTE)背后的技术和利益纠结——VoIP,VoLTE,SIP,IMS的前世今生
- LeetCode题解:Move Zeroes
- Windows下安装MySQL卡在Starting Server..的解决办法
- 移动APP的开发技巧(上)
- 各种排序的排序思想和实现
- Exynos4412裸机开发 —— A/D转换器
- Spring容器中Bean的作用域
- jQuery源代码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码具体解释
- 算法代码实现之冒泡排序,Golang(Go语言)实现
- AAC音频格式详解
- Bean获取Spring容器
- Android系统下载管理DownloadManager功能介绍及使用示例
- 浅析那些大型职业技术交流群是怎么被玩变质的?
- 浅析那些大型职业技术交流群是怎么被玩变质的?
- Schematic - "DesignEntry 30 ERROR Instance referencing symbol is out of date"
- iOS 8以上的设置的跳转
- BZOJ-3231 递归数列 矩阵连乘+快速幂
- 测试必备技能系列1 :通过mysql命令进行脚本数据导入
- LeetCode88——Merge Sorted Array