P1850 换教室
时间:2019-11-12
本文章向大家介绍P1850 换教室,主要包括P1850 换教室使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
P1850 换教室
首先说一个坑:
有自环,有重边
难受,直接邻接表
接着dp
分类讨论即可
四类,分别求和
代码:
#include<bits/stdc++.h> using namespace std; const int N=305,MAXN=2005; #define dl double int n,m,v,e; int c[MAXN],d[MAXN]; dl k[MAXN]; dl F[MAXN][2],G[MAXN][2]; dl f[N][N];//f[i][j][k]表示前i个,换j节课,现在在第c/d个教室所用最短路程 bool used[N]; dl dis[N]; int FF[N][N]; int hed[MAXN]={0},tal[MAXN],val[MAXN],nxt[MAXN],cnt=0; void dijkstra(){ for(int i=1;i<=v;i++){ memset(used,0,sizeof(used)); for(int j=0;j<N;j++) dis[j]=2000000000.0; dis[i]=0.00; for(int j=1;j<=v;j++){ int u=0; for(int k=1;k<=v;k++){ if(!used[k]&&dis[k]<dis[u]) u=k; } used[u]=1; for(int k=1;k<=v;k++){ int VAL=FF[u][k]; if(!used[k]){ if(dis[u]+VAL<dis[k]){ dis[k]=dis[u] + VAL; } } } } for(int j=1;j<=v;j++) f[i][j]=dis[j]; } } dl dlmin(dl x,dl y){ return (y-x)>0.00000001?x:y; } void dp__(){ for(int i=0;i<MAXN;i++){ F[i][0]=2000000000.0; F[i][1]=2000000000.0; G[i][0]=2000000000.0; G[i][1]=2000000000.0; } F[0][0]=0; F[1][1]=0; for(int i=2;i<=n;i++){ for(int j=0;j<=m;j++){ dl casex,casey; casex=(dl)F[j][0]+f[c[i-1]][c[i]]; casey=(dl)F[j][1]+k[i-1]*f[d[i-1]][c[i]]+(1-k[i-1])*f[c[i-1]][c[i]]; G[j][0]=dlmin(casey,casex); if(j!=0){ casex=(dl)F[j-1][1]+(1-k[i-1])*(1-k[i])*f[c[i-1]][c[i]]+k[i-1]*(1-k[i])*f[d[i-1]][c[i]]+(1-k[i-1])*k[i]*f[c[i-1]][d[i]]+k[i-1]*k[i]*f[d[i-1]][d[i]]; casey=(dl)F[j-1][0]+(1-k[i])*f[c[i-1]][c[i]]+k[i]*f[c[i-1]][d[i]]; G[j][1]=dlmin(casey,casex); } } for(int j=0;j<=m;j++) F[j][0]=G[j][0],F[j][1]=G[j][1]; // for(int i=1;i<=m;i++){ // cout<<F[i][0]<<" "<<F[i][1]<<endl; // } // cout<<"********"<<endl; } dl ans=2147483647.00; for(int i=0;i<=m;i++){ // cout<<F[i][0]<<" "<<F[i][1]<<endl; ans=dlmin(ans,F[i][0]); ans=dlmin(ans,F[i][1]); } printf("%.2lf\n",ans); } void addege(int x,int y,int z){ cnt++; tal[cnt]=y; val[cnt]=z; nxt[cnt]=hed[x]; hed[x]=cnt; } int main(){ memset(FF,127,sizeof(FF)); //freopen("a.in","r",stdin); //cout<<"**"<<endl; scanf("%d%d%d%d",&n,&m,&v,&e); for(int i=1;i<=n;i++) scanf("%d",&c[i]); for(int i=1;i<=n;i++) scanf("%d",&d[i]); for(int i=1;i<=n;i++) scanf("%lf",&k[i]); for(int i=1;i<=e;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); if(x==y) continue; FF[x][y]=min(FF[x][y],z); FF[y][x]=min(FF[y][x],z); } //cout<<"&&"<<endl; dijkstra(); //cout<<"*"<<endl; dp__(); return 0; }
原文地址:https://www.cnblogs.com/QYJ060604/p/11845352.html
- JavaScript 和asp.net配合编码字符串
- 3D游戏开发之UE4中的集合:TSet容器
- weblogic启动失败:Could not obtain the localhost address 解决办法
- 如何理解云计算?很简单,就像吃货想吃披萨了……
- .NET 2.0 中使用Active Directory 应用程序模式 (ADAM)
- struts2: 通过流输出实现exce导出
- Google的数据交换协议:GData (Google Data APIs Protocol)
- C# 内部类
- 四字母.com域名均以五位数结拍
- mybatis 3.2.7 与 spring mvc 3.x、logback整合
- spring 3.2.x + struts2 + mybatis 3.x + logback 整合配置
- struts2使用Convention Plugin在weblogic上以war包部署时,找不到Action的解决办法
- 使用xfce4桌面系统
- 号外!号外!Python纳入高考内容了!人工智能时代就要来临了!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法