POJ 2253 Frogger (求某两点之间所有路径中最大边的最小值)
生活随笔
收集整理的這篇文章主要介紹了
POJ 2253 Frogger (求某两点之间所有路径中最大边的最小值)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:有兩只青蛙,a在第一個石頭,b在第二個石頭,a要到b那里去,每種a到b的路徑中都有最大邊,求所有這些最大邊的最小值。
思路:將所有邊長存起來,排好序后,二分枚舉答案。
時間復雜度比較高,344ms。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h>using namespace std; const int maxn=210; const int INF=0x3f3f3f3f; double w[maxn][maxn]; //存儲邊長 double wlen[30000]; int con[maxn][maxn]; //con[i][j]=1表示i、j連通,con[i][j]=0表示不連通 int idx; int n; struct Node{int x,y; }node[maxn]; int main() {int t=0,a,b;double length;int ans;while(scanf("%d",&n)!=EOF){if(n==0)break;t++;idx=0;memset(w,0,sizeof(w));printf("Scenario #%d\n",t);for(int i=0;i<n;i++){scanf("%d%d",&a,&b);node[i].x=a;node[i].y=b;}for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){//pow傳遞的參數先要強制轉換成double,否則提交編譯錯誤length=pow(double(node[j].x-node[i].x),2)+pow(double(node[j].y-node[i].y),2);length=sqrt(length);w[i][j]=w[j][i]=length;wlen[idx++]=length;}}sort(wlen,wlen+idx);//二分枚舉所有可能的值,floyd的時候考慮所有長度不大于該值的邊int l=0,r=idx-1,mid;while(l<=r){mid=(l+r)>>1;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){//初始化,con[i][j]=1表示邊i、j長度不大于枚舉值,=0表示大于枚舉值if(w[i][j]>wlen[mid])con[i][j]=con[j][i]=0;elsecon[i][j]=con[j][i]=1;}}for(int k=0;k<n;k++){for(int i=0;i<n;i++){for(int j=0;j<n;j++){//只要有一對con[i][k]、con[k][j]連通,con[i][j]就連通con[i][j]|=con[i][k]&con[k][j];}}}if(con[0][1]){r=mid-1;ans=mid;}else{l=mid+1;}}printf("Frog Distance = %.3lf\n",wlen[ans]);puts("");}return 0; }?
這里附上別人的代碼:
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; double dist[202][202]; //dist[i][j]表示i到j的路徑中邊的最大值的最小值 int n; struct Node {int x;int y; } e[202]; void Floyd() {for(int k=0; k<n; k++) {for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {if(max(dist[i][k],dist[k][j])<dist[i][j])dist[i][j]=max(dist[i][k],dist[k][j]);}}}} int main() {int t=1;while(~scanf("%d",&n)) {if(n==0)break;for(int i=0; i<n; i++) {scanf("%d%d",&e[i].x,&e[i].y);}for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {dist[i][j]=sqrt(pow((double)(e[i].x-e[j].x),2)+pow((double)(e[i].y-e[j].y),2));}}Floyd();printf("Scenario #%d\n",t++);printf("Frog Distance = %.3f\n\n",dist[0][1]);} }?
轉載于:https://www.cnblogs.com/chenxiwenruo/p/3374271.html
總結
以上是生活随笔為你收集整理的POJ 2253 Frogger (求某两点之间所有路径中最大边的最小值)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android如果对APK进行加密,提高
- 下一篇: Hadoop2源码分析-RPC机制初识