hdu2489 Minimal Ratio Tree
2014-03-11 21:56
274 查看
哎 直接枚举所有m个点 求最小生成树
按题意来就行了。。
另外还要加一个剪枝
在存点的编号 用点的编号的地方wa了好久好久。。
按题意来就行了。。
另外还要加一个剪枝
在存点的编号 用点的编号的地方wa了好久好久。。
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #define inf 0x3f3f3f3f #define ll __int64 using namespace std; int ans[20],d[20],vis[20],s[20],w[20],e[20][20],n,m; double rat; void prim() { int i,j,t,minweight,p,tmp,sum; memset(vis,0,sizeof vis); minweight=0; p=s[1];vis[p]=1;d[p]=0; for(i=1;i<=m;i++) if(s[i]!=p) d[s[i]]=e[p][s[i]]; for(i=1;i<m;i++) { tmp=inf; for(j=1;j<=m;j++) { t=s[j]; if(!vis[t]&&tmp>d[t]) { tmp=d[t]; p=t; } } vis[p]=1; minweight+=d[p]; for(j=1;j<=m;j++) { t=s[j]; if(!vis[t]&&d[t]>e[t][p]) d[t]=e[t][p]; } } //更新最小minweight/sum sum=0; for(i=1;i<=m;i++) sum+=w[s[i]]; double tt=minweight*1.0/sum; if(tt<rat) { rat=tt; for(i=1;i<=m;i++) ans[i]=s[i]; } } void dfs(int cnt,int p) { if(cnt==m+1) { prim(); return; } if(n-p<m-cnt) return; for(int i=p;i<=n;i++) { s[cnt]=i; dfs(cnt+1,i+1); } } int main() { int i,j; while(scanf("%d%d",&n,&m)&&(n||m)) { rat=inf; for(i=1;i<=n;i++) scanf("%d",&w[i]); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) scanf("%d",&e[i][j]); } dfs(1,1); for(i=1;i<m;i++) printf("%d ",ans[i]); printf("%d\n",ans[m]); } return 0; }
相关文章推荐
- Windows平台下LispBox环境搭建
- 黑马程序员09_IO
- 取得表中数据的insert语句
- 关于struts、spring 和 hibernate的说明
- fgets()
- 【贪心算法】喷水装置
- iOS 应用程序的生命周期
- css滑动门实现
- c/c++ 100行代码破解winrar
- Get与Post的区别
- System Center 2012R2之SCOM监控SQL DB服务器系统
- 挨踢之路之学习流程篇(六)
- 最大间隙问题 线性时间算法
- Struts2 namespace总结
- activity的生命周期
- 使用bat快速创建cocos2d-x模板
- 海贼王通缉令在线生成器
- UVa 116 - Unidirectional TSP
- 使用bat快速创建cocos2d-x模板
- 第2周:Java事件处理