数组开小了,是Runtime Error,而我却记成了Time Limit Exceeded,又搞笑了,要对这些简单的算法熟悉到上手就能写的地步,这不仅节约时间,还能减少自己出bug的几率,熟能生巧
注意:在printf中,对于float和double最好都用%f
%f是按double类型输出的,一直%f都是double,没有%lf,但是后来貌似%lf后来加上了,而%Lf表示long double。so我就无法弄清了,查阅一下资料 csdn论坛 某某博客讲解
Dijkstra:
/*
题目大意:第一行起点,第二行中点,从起点到终点。
求跳跃过程,最小的最大跳跃距离,意思就是让求最小的最大边
思路:Dijkstra算法 只是求最短路径那变形了,将求最短路径
那儿改成求最大边,第一次将
这个算法写成函数了,好激动有木有,,,
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct Point
{
int x;
int y;
}p[105];
const int INF = 0x3f3f3f3f;
double e[205][205],dis[205],distan;
int n,book[205];
//计算距离
inline double Calcu(int a,int b)
{
return sqrt((double)(p[a].x-p[b].x) * (p[a].x-p[b].x)+(p[a].y-p[b].y) *(p[a].y-p[b].y));
}
//核心算法
void Dijkstra()
{
double minn;
int u,v;
for(int i=1;i<=n-1;i++)
{
minn = INF;
for(int j=1;j<=n;j++)
{
if(book[j] == 0&&dis[j] < minn)
{
minn = dis[j];
u = j;
}
}
if(u==2) return;
book[u] = 1;
for(v = 1;v <= n;v++)
{
//if(e[u][v] < INF)
//{
if(!book[v]&&dis[v] > max(dis[u] , e[u][v]))
dis[v] = max(dis[u] , e[u][v]);
//}
}
}
}
int main()
{
int t=0;
while(~scanf("%d",&n)&&n)
{
for(int i = 1;i <= n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
for(int j = i;j >= 1;j--)
{
distan = Calcu(i,j);
e[i][j] = e[j][i] = distan;
}
}
memset(book,0,sizeof(book));
for(int i = 1;i <= n;i++)
dis[i] = e[1][i];
book[1] = 1;
Dijkstra();
printf("Scenario #%d\n",++t);
printf("Frog Distance = %.3f\n\n",dis[2]);
}
return 0;
}
200上限,Floyd-Warshall才有了用武之地,,,
Floyd-Warshall:
/*
题目大意:第一行起点,第二行中点,从起点到终点。
求跳跃过程,最小的最大跳跃距离,意思就是让求最小的最大边
思路:Dijkstra算法 只是求最短路径那变形了,将求最短路径
那儿改成求最大边,第一次将
这个算法写成函数了,好激动有木有,,,
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct Point
{
int x;
int y;
}p[105];
const int INF = 0x3f3f3f3f;
double e[205][205],distan;
int n;
//计算距离
inline double Calcu(int a,int b)
{
return sqrt((double)(p[a].x-p[b].x) * (p[a].x-p[b].x)+(p[a].y-p[b].y) *(p[a].y-p[b].y));
}
int main()
{
int t=0;
while(~scanf("%d",&n)&&n)
{
for(int i = 1;i <= n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
for(int j = i;j >= 1;j--)
{
distan = Calcu(i,j);
e[i][j] = e[j][i] = distan;
}
}
//Floyd-Warshall核心算法
for(int k = 1;k <= n;k++)
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
if(e[i][j] > max(e[i][k] , e[k][j]))
e[i][j] = max(e[i][k] , e[k][j]);
printf("Scenario #%d\n",++t);
printf("Frog Distance = %.3f\n\n",e[1][2]);
}
return 0;
}