题意:平面上有N个石头,给出坐标。一只青蛙从1号石头跳到2号石头,使路径上的最长便最短。输出这个值。(2≤N≤200)

解法:最小瓶颈树。而由于这题N比较小便可以用2种方法:
1.最短路径中提到过的Floyd算法,利用DP思想枚举出所有情况,O(n3)。具体关于Floyd算法的一些解释得等我过几天写一篇博文。
2.用Kruskal算法求出最小生成树再求出路径上的最长边权。具体解释见我之前的一篇博文: 关于生成树的拓展 {附【转】最小瓶颈路与次小生成树}(图论--生成树)

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<cmath>
5 #include<iostream>
6 using namespace std;
7
8 const int N=210;
9 const double INF=300010.0;
10 double d[N][N];
11 struct node{int x,y;}a[N];
12
13 double mmin(double x,double y) {return x<y?x:y;}
14 double mmax(double x,double y) {return x>y?x:y;}
15 double dist(int i,int j) {return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));}
16 int main()
17 {
18 int n,T=0;
19 while (scanf("%d",&n)!=EOF && n)
20 {
21 int i,j,k;
22 for (i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
23 for (i=1;i<=n;i++)
24 for (j=i;j<=n;j++)
25 d[i][j]=d[j][i]=dist(i,j);
26 for (k=1;k<=n;k++)//???
27 for (i=1;i<=n;i++)
28 for (j=1;j<=n;j++)//?i?j????1~k????????????
29 d[i][j]=mmin(d[i][j],mmax(d[i][k],d[k][j]));
30 printf("Scenario #%d\nFrog Distance = %.3lf\n\n",++T,d[1][2]);
31 }
32 }

1

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<cmath>
5 #include<algorithm>
6 #include<iostream>
7 using namespace std;
8
9 const int N=210,M=20010;
10 const double INF=300010.0;
11 int n,m;
12 int fa[N];
13 struct node{int x,y;}a[N];
14 struct edge
15 {
16 int x,y;
17 double d;
18 edge() {}
19 edge(int i,int j,double k) {x=i;y=j;d=k;}
20 }e[M];
21
22 double mmin(double x,double y) {return x<y?x:y;}
23 double mmax(double x,double y) {return x>y?x:y;}
24 bool cmp(edge x,edge y) {return x.d<y.d;}
25 double dist(int i,int j) {return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));}
26
27 int ffind(int x)
28 {
29 if (fa[x]!=x) fa[x]=ffind(fa[x]);
30 return fa[x];
31 }
32 double Kruskal(int u,int v)
33 {
34 int i;
35 for (i=1;i<=n;i++) fa[i]=i;
36 sort(e+1,e+1+m,cmp);
37 for (i=1;i<=m;i++)
38 {
39 int x=e[i].x,y=e[i].y;
40 int xx=ffind(x),yy=ffind(y);
41 if (xx!=yy)
42 {
43 fa[xx]=yy;
44 //if (x==u||y==u||x==v||y==v)//wrong
45 if (ffind(u)==ffind(v)) return e[i].d;
46 }
47 }
48 }
49 int main()
50 {
51 int T=0;
52 while (scanf("%d",&n)!=EOF && n)
53 {
54 int i,j;
55 for (i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
56 m=0;
57 for (i=1;i<=n;i++)
58 for (j=i+1;j<=n;j++)
59 e[++m]=edge(i,j,dist(i,j));
60 printf("Scenario #%d\nFrog Distance = %.3lf\n\n",++T,Kruskal(1,2));
61 }
62 }

2

P.S.而我之前关于代码2打的超复杂:“乖乖地”跑完一次Kruskal后删边,再建立邻接表,打算Bfs一次......

最新文章

  1. 【DWR系列03】- DWR主要类详解
  2. java-并发-线程
  3. src/main/Java路径下的properties文件丢失
  4. 一个简单得不能再简单的“ORM”了
  5. 0025 Java学习笔记-面向对象-final修饰符、不可变类
  6. ionic ios 友盟多渠道/自动签名/加固之腾讯云。乐固
  7. 在mac下svn冲突或其它什么原因无法更新svn副本或是必须要删除svn信息时,如何清除svn信息
  8. Viewprot meta学习笔记
  9. nodejs-基本语法
  10. mybatis-config.xml详解
  11. UVa 10601 (Polya计数 等价类计数) Cubes
  12. Source Insight新建工程文件
  13. 技能CDDemo(点击鼠标左键实现技能界面旋转)
  14. Java内存泄露实例
  15. ObjectARX自定义实体的最近点和垂点捕捉算法
  16. 01---Spring框架
  17. nginx命令启动及选项
  18. eclipse背景色设置成护眼色(豆沙绿)
  19. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 auto-focus
  20. SDN上机第二次作业

热门文章

  1. JMeter如何设置语言为中文
  2. LeetCode557 反转字符串中的单词 III
  3. 【Oracle】表空间配额问题
  4. ctfhub技能树—信息泄露—备份文件下载—vim缓存
  5. ts类与修饰符
  6. REUSE_ALV_GRID_DISPLAY_LVC 的fieldcat定义
  7. JAVA获取当前文件路径this.getClass().getResource方法详细讲解
  8. inode占满导致No space left on device inode快速解决方法
  9. uni-app开发经验分享十六:发布android版App的详细过程
  10. 安卓开发视频教程!想找工作的你还不看这份资料就晚了!Android校招面试指南