POJ 2253 Frogger

来源:互联网 发布:mysql时间转换成毫秒值 编辑:程序博客网 时间:2024/05/29 17:34

题目链接:http://poj.org/problem?id=2253

题意:

求:所有到达目的地路径中边权值最大的集合中 最小的那个值

换句话说 就是求最短路径中出现的最大权值.


只需要更改dijkstra的更新条件:

/*最短路中的最长边改变更新条件原来:if(!vis[j]&&dis[j]>dis[pos]+G[pos][j])    dis[j]=dis[pos]+G[pos][j];改为if(!vis[j]&&dis[j]>max(dis[pos],G[pos][j]))    dis[j]=max(dis[pos],G[pos][j]);此时,dis[]存的是到达第k个数的最长边的最小值*/

/*最短路中的最长边改变更新条件原来:if(!vis[j]&&dis[j]>dis[pos]+G[pos][j])    dis[j]=dis[pos]+G[pos][j];改为if(!vis[j]&&dis[j]>max(dis[pos],G[pos][j]))    dis[j]=max(dis[pos],G[pos][j]);此时,dis[]存的是到达第k个数的最长边的最小值*/#include<cstdio>#include<cmath>#define INF 1000000000const int N=201;struct node{    double x,y;    int i;};double max(double a,double b){return a>b?a:b;}node f[N];double G[N][N];double low[N];void calc(const node &a,const node &b){    double dis=sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));    G[a.i][b.i]=G[b.i][a.i]=dis;}double dijkstra(int s,int e,int n){    double dis[N];    bool vis[N]={0};    int pos=0,i,j;    double minn;    for(int i=0;i<n;++i)        dis[i]=G[pos][i];    vis[pos]=true;    dis[s]=0;    for(i=1;i<n;++i){        for(minn=INF,j=0;j<n;++j){            if(!vis[j]&&dis[j]<minn){                minn=dis[j];                pos=j;            }        }        vis[pos]=true;        for(j=0;j<n;++j)if(!vis[j]){            if(dis[j]>max(G[pos][j],dis[pos])){                dis[j]=max(G[pos][j],dis[pos]);            }        }        //printf("dis[0]:%lf dis[1]:%lf dis[2]=%lf\n",dis[0],dis[1],dis[2]);    }    return dis[e];}int main(){    int n,cnt=0;    while(scanf("%d",&n),n){        for(int i=0;i<n;++i){            scanf("%lf %lf",                  &f[i].x,&f[i].y);            f[i].i=i;        }        for(int i=0;i<n;++i)            for(int j=0;j<n;++j)                G[i][j]=INF;        for(int j=0;j<n;++j)        for(int i=j+1;i<n;++i){            calc(f[j],f[i]);        }        double ans=dijkstra(0,1,n);        ++cnt;        printf("Scenario #%d\n",cnt);        printf("Frog Distance = %.3lf\n\n",ans);    }}


0 0
原创粉丝点击