codevs 1183 泥泞的道路
2015-10-24 12:34
267 查看
题目描述 Description
CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连。因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同。小A经过对近期天气和地形的科学分析,绘出了每条道路能顺利通过的时间以及这条路的长度。
现在小A在小区1,他希望能够很顺利地到达目的地小区n,请帮助小明找出一条从小区1出发到达小区n的所有路线中(总路程/总时间)最大的路线。请你告诉他这个值。
输入描述 Input Description
第一行包含一个整数n,为小区数。
接下来n*n的矩阵P,其中第i行第j个数表示从小区i到小区j的道路长度为Pi,j。第i行第i个数的元素为0,其余保证为正整数。
接下来n*n的矩阵T,第i行第j个数表示从小区i到小区j需要的时间Ti,j。第i行第i个数的元素为0,其余保证为正整数。
输出描述 Output Description
写入一个实数S,为小区1到达n的最大答案,S精确到小数点后3位。
样例输入 Sample Input
3
0 8 7
9 0 10
5 7 0
0 7 6
6 0 6
6 2 0
样例输出 Sample Output
2.125
数据范围及提示 Data Size & Hint
【数据说明】
30%的数据,n<=20
100%的数据,n<=100,p,t<=10000
蛮早之前写的题了……今天有空刚好把博客写了
要求总路程/总时间的值最大,由于路程和时间分属两个图,因此从任何一个开始搜索然后把另外一张图的值对于处理出来最后取个max得到答案显然是没问题的
期望分……30吧
很明显的可以看出直接搜索的复杂度实在是突破天际不合适,那么怎么处理比较快一点呢
所以
总路程=答案*总时间
答案*总时间-总路程越接近0越是接近正解
那么二分答案再使用最短路验证的话,就可以解决这道题啦~~~
(这题由于是double,精度什么的需要好好处理一下…………)
CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连。因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同。小A经过对近期天气和地形的科学分析,绘出了每条道路能顺利通过的时间以及这条路的长度。
现在小A在小区1,他希望能够很顺利地到达目的地小区n,请帮助小明找出一条从小区1出发到达小区n的所有路线中(总路程/总时间)最大的路线。请你告诉他这个值。
输入描述 Input Description
第一行包含一个整数n,为小区数。
接下来n*n的矩阵P,其中第i行第j个数表示从小区i到小区j的道路长度为Pi,j。第i行第i个数的元素为0,其余保证为正整数。
接下来n*n的矩阵T,第i行第j个数表示从小区i到小区j需要的时间Ti,j。第i行第i个数的元素为0,其余保证为正整数。
输出描述 Output Description
写入一个实数S,为小区1到达n的最大答案,S精确到小数点后3位。
样例输入 Sample Input
3
0 8 7
9 0 10
5 7 0
0 7 6
6 0 6
6 2 0
样例输出 Sample Output
2.125
数据范围及提示 Data Size & Hint
【数据说明】
30%的数据,n<=20
100%的数据,n<=100,p,t<=10000
蛮早之前写的题了……今天有空刚好把博客写了
要求总路程/总时间的值最大,由于路程和时间分属两个图,因此从任何一个开始搜索然后把另外一张图的值对于处理出来最后取个max得到答案显然是没问题的
期望分……30吧
很明显的可以看出直接搜索的复杂度实在是突破天际不合适,那么怎么处理比较快一点呢
二分!
答案=总路程/总时间所以
总路程=答案*总时间
答案*总时间-总路程越接近0越是接近正解
那么二分答案再使用最短路验证的话,就可以解决这道题啦~~~
(这题由于是double,精度什么的需要好好处理一下…………)
[code]#include<iostream> #include<cstdio> #include<queue> #include<cstdlib> #include<cstring> using namespace std; const int maxn=233333; int map1[500][500]; int map2[500][500]; struct doubi{ int f,t,l,s; double sum; }edge[maxn]; int next[maxn],first[maxn],tot; void build(int f,int t,int d1,int d2){ edge[++tot].f=f; edge[tot].t=t; edge[tot].l=d1; edge[tot].s=d2; next[tot]=first[f]; first[f]=tot; } double dist[maxn]; bool use[maxn]; queue<int> q; int vis[maxn]; int n; bool check(double ans) { for(int i=1;i<=tot;i++){ edge[i].sum=edge[i].l-ans*edge[i].s; } for(int i=1;i<=n;i++){ dist[i]=-2174836; } memset(vis,0,sizeof(vis)); memset(use,0,sizeof(use)); while(!q.empty()){ q.pop(); } q.push(1); dist[1]=0; use[1]=1; while(!q.empty()) { int u=q.front(); q.pop(); use[u]=0; for(int i=first[u];i;i=next[i]){ int v=edge[i].t; if(dist[v]<dist[u]+edge[i].sum){ dist[v]=dist[u]+edge[i].sum; if(!use[v]){ use[v]=1; vis[v]++; if(vis[v]>=n){ return true; } q.push(v); } } } } if(dist >0) return true; return false; } double div() { double down=-1,up=100000; while(down+0.00001<up){ double mid=(up+down)/2; if(!check(mid)) up=mid; else down=mid; //cout<<"fuckcy"<<endl; } return up; } int main() { cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&map1[i][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&map2[i][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i!=j) build(i,j,map1[i][j],map2[i][j]); } } /*check(2.125); for(int i=1;i<=n*2;i++){ cout<<edge[i].sum<<" "; } cout<<endl; cout<<dist <<endl;*/ printf("%.3lf",div()); return 0; }
相关文章推荐
- js模块加载之AMD和CMD
- U-boot-2010.09移植(六)NAND Flash启动支持
- C++函数指针简介
- C++函数指针简介
- [原]Android Studio使用极光推送出现at cn.jpush.android.service.ServiceInterface.a(Unknown Source) 已解决
- Hibernate-映射关系- n->1(单向)
- FL2440的U-boot-2009.08移植(五)uboot架构中NAND Flash驱动修改
- POJ 1182——食物链——————【种类并查集】
- Corona的工程配置
- FL2440的U-boot-2009.08移植(四) 支持DM900网卡
- hdoj 2063 过山车 【双边匹配匈牙利算法】
- 设计模式之Builder模式
- 利用UIWebView打造一个炫酷的视频背景视图(OC & Swift)
- jquery 设置style:display
- 50. PHP 页面静态化(3)
- 九度OJ 1142:Biorhythms(生理周期) (中国剩余定理)
- FL2440的U-boot-2009.08移植(三)支持Nor FLASH
- 安卓访问网络,从数据库拿数据
- 图像归一化
- jquery 设置style:display