poj 2253(3种最短路搞法)
来源:互联网 发布:怎么打开手机网络 编辑:程序博客网 时间:2024/05/16 17:37
题意:一只青蛙在湖中一颗石头上, 它想去有另一只青蛙的石头上,但是 湖里的水很脏,它不愿意游泳,所以它要跳过去;
给出 两只青蛙所在石头的坐标, 及 湖里其他石头的坐标;任一两个坐标点间都是双向连通的。显然从1到2存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离。
#include<iostream>#include<algorithm>#include<cstdio>#include<vector>#include<queue>#include<map>#include<cmath>#include<cstring>using namespace std;#define INF 1e7#define maxn 205typedef long long LL;int n,x[maxn],y[maxn];double w[maxn][maxn];double d[maxn];bool inq[maxn];double dist(int x1,int y1,int x2,int y2){return sqrt((double)(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}struct Heapnode{ int u; double w; bool operator < (const Heapnode & pp) const { return w>pp.w; }};void dijkstra(double m){ for(int i=0;i<=n;i++)d[i]=INF; d[1]=0; memset(inq,0,sizeof(inq)); priority_queue<Heapnode>q; q.push((Heapnode){1,0}); while(!q.empty()) { Heapnode tmp=q.top();q.pop(); int u=tmp.u; if(inq[u])continue; inq[u]=true; for(int i=1;i<=n;i++)if(w[u][i]<=m&&d[i]>d[u]+m-w[u][i]) { d[i]=d[u]+m-w[u][i]; if(d[2]<INF)return ; q.push((Heapnode){i,d[i]}); } }}int main(){ int cas=0; while(~scanf("%d",&n)&&n) { cas++; for(int i=1;i<=n;i++) scanf("%d%d",x+i,y+i); for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) { w[i][j]=w[j][i]=(i==j?0:dist(x[i],y[i],x[j],y[j])); } printf("Scenario #%d\n",cas); double l=0,r=40000.0; while(r-l>=0.0001) { double m=(l+r)/2; dijkstra(m); if(d[2]<INF)r=m; else l=m; } printf("Frog Distance = %.3f\n\n",l); } return 0;}
#include<iostream>#include<algorithm>#include<cstdio>#include<vector>#include<queue>#include<map>#include<cmath>#include<cstring>using namespace std;#define INF 1e7#define maxn 205typedef long long LL;int n,x[maxn],y[maxn];double w[maxn][maxn];double d[maxn];bool inq[maxn];double dist(int x1,int y1,int x2,int y2){return sqrt((double)(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}void spfa(double s){ for(int i=0;i<=n;i++)d[i]=(i==1?0:INF); memset(inq,0,sizeof(inq)); queue<int>q; q.push(1); while(!q.empty()) { int u=q.front();q.pop(); inq[u]=false; for(int i=1;i<=n;i++) { if(w[u][i]>s)continue; if(d[u]-w[u][i]+s<=d[i])d[i]=d[u]+s-w[u][i]; else continue; if(d[2]<INF)return ; if(!inq[i]) { inq[i]=true; q.push(i); } } }}int main(){ int cas=0; while(~scanf("%d",&n)&&n) { cas++; for(int i=1;i<=n;i++) scanf("%d%d",x+i,y+i); for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) { w[i][j]=w[j][i]=(i==j?0:dist(x[i],y[i],x[j],y[j])); } printf("Scenario #%d\n",cas); double l=0,r=40000.0; while(r-l>=0.0001) { double m=(l+r)/2; spfa(m); if(d[2]<INF)r=m; else l=m; } printf("Frog Distance = %.3f\n\n",l); } return 0;}
#include<iostream>#include<algorithm>#include<cstdio>#include<vector>#include<queue>#include<map>#include<cmath>#include<cstring>using namespace std;#define INF 1e7#define maxn 205typedef long long LL;int n,x[maxn],y[maxn];double w[maxn][maxn];double d[maxn];bool inq[maxn];double dist(int x1,int y1,int x2,int y2){return sqrt((double)(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}void floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n-1;i++) for(int j=i+1;j<=n;j++) { if(w[i][j]>w[i][k]&&w[i][j]>w[k][j]) { if(w[i][k]>w[k][j])w[i][j]=w[j][i]=w[i][k]; else w[i][j]=w[j][i]=w[k][j]; } }}int main(){ int cas=0; while(~scanf("%d",&n)&&n) { cas++; for(int i=1;i<=n;i++) scanf("%d%d",x+i,y+i); for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) { w[i][j]=w[j][i]=(i==j?0:dist(x[i],y[i],x[j],y[j])); } printf("Scenario #%d\n",cas); floyd(); printf("Frog Distance = %.3f\n\n",w[1][2]); } return 0;}
1 0
- poj 2253(3种最短路搞法)
- poj 2253 最短路
- poj 2253 最短路
- POJ 2253 最短路
- poj 2253 Frogger (最短路Floyd)
- POJ 2253 Frogger(最短路 Floyd)
- POJ 2253 - Frogger(最短路`dijkstra)
- POJ 2253 Frogger最短路(floyd)
- POJ 2253 Frogger(最短路变形)
- poj 2253 Frogger (dijkstra最短路)
- POJ-2253 Frogger (最短路)
- POJ 2253 Frogger(最短路/迪杰斯特拉)
- 【Poj】-2253-Frogger(最短路,变化)
- POJ 2253Frogger(最短路floyd)
- POJ 2253 floyd 最短路
- poj 2253 floyd最短路!!!
- [POJ 2253] Frogger [最短路]
- POJ 2253 Frogger 最短路
- Java网络编程(http://52android.blog.51cto.com/2554429/482954)
- MVC请求 处理 响应【用户登陆】
- Linux下应用开源的库函数的时候 一定要 在两个文件中 注意
- 不显示界面的看护程序(看护进程)
- poj 1088滑雪
- poj 2253(3种最短路搞法)
- CSDN高校俱乐部有奖调查:实习就业需求调研
- 设计模式之模板方法模式
- dscp
- ngui 做技能冷却
- 疑难点积累(二)
- 一些题:面面准备
- 双显示器任务栏 Dual Monitor Taskbar
- C#获取文件夹下的所有文件的文件名