zoj1665 dij变形
2015-07-28 10:44
295 查看
既然输入的是损坏率,那1-x就是剩余的。最后只要剩余的最大。
#include<stdio.h> #include<string.h> #define Max 99999999 const int maxn=1003; double dis[maxn],map[maxn][maxn]; int vis[maxn],n,val[maxn]; void init() { int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) map[i][j]=0; else map[i][j]=0; } void dij() { int i,j,pos; pos=n; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dis[i]=0; dis[pos]=1; // vis[pos]=1; for(i=1;i<=n;i++) { double min=-Max; for(j=1;j<=n;j++) { if(!vis[j]&&min<dis[j]) { pos=j; min=dis[j]; } } vis[pos]=1; for(j=1;j<=n;j++) { if(!vis[j]&&dis[j]<map[pos][j]*dis[pos]) dis[j]=map[pos][j]*dis[pos]; } } } int main() { int i,j,m; double cost; while(scanf("%d%d",&n,&m)!=EOF) { init(); for(i=1;i<n;i++) scanf("%d",&val[i]); for(i=1;i<=m;i++) { int x,y; scanf("%d%d%lf",&x,&y,&cost); if(map[x][y]<1-cost) map[x][y]=map[y][x]=1-cost; } /*for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { printf("%.2lf ",map[i][j]); } printf("\n"); }*/ double ans=0; dij(); /*for(i=1;i<=n;i++) printf("%d ",dis[i]); printf("\n");*/ for(i=1;i<n;i++) ans+=val[i]*dis[i]; printf("%.2lf\n",ans); } }
相关文章推荐
- 二分查找算法笔记。
- 数据结构
- 步步为营(十)常用数据结构(3)STL-Deque(双端队列)
- 基础问答
- arm板子挂在nfs失败-mount: wrong fs type
- 写mapreduce程序实现kmeans算法
- HDU 1686 Oulipo POJ 3461 Oulipo
- Spring MVC详解(三)DispatcherServlet作用
- 使用Visual Studio创建映像向导(Image Sprite)——Web Essential
- iOS 添加滚动scrollView自动滚动广告页
- 黑马程序员——Java基础——基础常识
- https 对接非对称密钥加密 MD5及数字签名相关
- java面试题:i=i++和j=i++两句分别输出i=?,j=?
- 进程间通信的分类
- Android studio 界面设置,快捷键设置
- 分果子耗体力
- Zero-copy(NIO)
- 学生管理系统
- 设计模式-单例模式
- Java中什么叫封装啊?