B - Frogger

题意:两只青蛙,A和B,A想到B哪里去,但是A得弹跳有限制,所以不能直接到B,但是有其他的石头作为过渡点,可以通过他们到达B,问A到B的所有路径中,它弹跳最大的跨度的最小值

分析:最短路问题,用prim解决的;开始想用dijkstra去做,写了一下发现掌握不熟练写不出来,看了别人的,然后就用了最小生成树,中间还是出了很多问题,有模板是好,但是不会灵活运用,那就尴尬了。。。。。

AC代码 :

#include <iostream>//最小生成树解决的
#include<cstdio>
#include<cmath>
#include<cstring>
#define MAX 100000
using namespace std;
int n,k;
double mincost,m;
double g[1001][1001],lowcost[1001];
int vis[1001];
struct Node
{
double x,y;
} node[1001];
void prim()
{
mincost=0;
for(int i=1; i<=n; i++)
//vis[i]=0;这个必须标记
lowcost[i]=g[1][i];
vis[1]=1;
for(int i=1; i<=n; i++)
{
m=MAX;
for(int j=1; j<=n; j++)
if(!vis[j]&&lowcost[j]<m)
{
m=lowcost[j];
k=j;
}
if(mincost<m)
mincost=m;
if(k==2) break;//这句话很关键.?????意思是只有两个石头的时候
vis[k]=1;
for(int j=1; j<=n; j++)
if(!vis[j]&&lowcost[j]>g[k][j])
lowcost[j]=g[k][j];
}
}
//如果我是将所有还没走过的点标记为0,走过的标记为1的话,运行为0ms;无需清零
//如果我只标记经过的点,然后清零的话就需要16ms,但是如果加上if(i==j) g[i][i]=0;则又是0ms;
int main()
{
int cnt=1;
while(~scanf("%d",&n))
{
memset(vis,0,sizeof(vis));
if(n==0) break;
for(int i=1; i<=n; i++)
scanf("%lf%lf",&node[i].x,&node[i].y);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
if(i==j) g[i][i]=0;
else g[i][j]=MAX;
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
g[i][j]=sqrt(fabs(node[j].x-node[i].x)*fabs(node[j].x-node[i].x)+fabs(node[j].y-node[i].y)*fabs(node[j].y-node[i].y))*1.000;
}
prim();
printf("Scenario #%d\n",cnt++);
printf("Frog Distance = %.3f\n\n",mincost);//不能用.3lf,那样会出错,因为lf只能用于scanf中,基础没打好。。。
}
return 0;
}

posted @ 2016-07-27 20:54  踮起脚望天  阅读(423)  评论(0编辑  收藏  举报