当前位置:编程学习 > C/C++ >>

Frogger 最短路变种

[cpp]
/*注意细节。memset里面的0x7f和常数赋值的0x7f差别很大。常数赋值的数值很小。而memset内部是按照字节进行赋值。是一个很大的值。
这一道题是一道最短路的变种。实际上是求所有路径中最大边的最小值。
起点是1,终点为2.*/ 
#include <stdio.h> 
#include <cstring> 
#include <cmath> 
#include <iostream> 
using namespace std; 
double dist[201]; 
double map[201][201]; 
bool vis[201]; 
struct point 

    double x,y; 
}; 
point p[201]; 
double dis(point a,point b) 

    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 

int main() 

    int n; 
    int ca=1; 
    while(scanf("%d",&n)==1&&n) 
    { 
        for(int i=1;i<=n;i++) 
        scanf("%lf%lf",&p[i].x,&p[i].y); 
        memset(vis,false,sizeof(vis)); 
        memset(dist,0x7f,sizeof(dist)); 
        for(int i=1;i<=n;i++) 
        for(int j=1;j<=n;j++) 
        map[i][j]=map[j][i]=dis(p[i],p[j]); 
        dist[1]=0; 
        for(int i=1;i<=n;i++) 
        { www.zzzyk.com
            double minn=0x7f7f7f7f; 
            int k; 
            for(int j=1;j<=n;j++) 
            { 
                if(!vis[j]&&dist[j]<minn) 
                { 
                    k=j; 
                    minn=dist[j]; 
                } 
            } 
            vis[k]=true; 
            for(int j=1;j<=n;j++) 
            dist[j]=min(dist[j],max(dist[k],map[k][j])); 
        } 
        printf("Scenario #%d\n",ca++); 
        printf("Frog Distance = %.3lf\n",dist[2]); 
        printf("\n"); 
    } 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,