AcWing 4240. 青蛙(最短路 or 最小生成树)
题目连接
https://www.acwing.com/problem/content/description/4243/
http://poj.org/problem?id=2253
思路
思路一(最短路)
我们直接跑一个最短路就好,基本上所有的最短路都可以,然后注意的是我们在做松弛操作的时候,也就是判断是否应该加入我们的优先队列中的时候,我们做的不是一个加上这条边而是和这条边去一个max
,也就是如果我们当前正在对起点t
,终点j
做一个松弛操作,那么我们做的不是dis[j]=max(dis[j],dis[t]+w)
而是dis[j]=max(dis[t],w)
我们这样就能记录下最长边了,那么现在的dis[i]
表示的就是从1开始到i结束的最长边的长度,而不是累计长度
思路二(最小生成树)
其实你发现没有,我们这里要求的问题其实就是让这个图联通的最大长度,那么这不就是最小生成树吗,我们对边进行排序,排完序后我们开始将边不断地加入集合中,最后让这个图联通的这个边自然就是整个连通图的最长距离了,所以我们可以直接通过最小生成树来解决这个问题
代码
最短路代码
#include<bits/stdc++.h>
using namespace std;#define ll long long
#define PII pair<int,int>
const int N = 2e2+10;int dis[N],n;struct Point{int x,y;
}V[N];struct Node{int v,w;
};
vector<Node> E[N];bool vis[N];void DJ(){priority_queue<PII,vector<PII>,greater<PII> > que;que.push({0,1});dis[1] = 0;while(!que.empty()){int w = que.top().first;int t = que.top().second;que.pop();if(vis[t]) continue;vis[t] = true;for(int i = 0,l = E[t].size(); i < l; ++i) {int j = E[t][i].v;int k = E[t][i].w;if(dis[j] > max(dis[t],k)){dis[j] = max(dis[t],k);que.push({dis[j],j});}}}
}inline int get_len(Point a,Point b){return (a.x-b.x) * (a.x-b.x) + (a.y-b.y) * (a.y-b.y);
}void init(){for(int i = 1;i <= n; ++i) E[i].clear(),dis[i] = 0x3f3f3f3f,vis[i] = false;
}int main()
{int t = 1;while(cin>>n,n){init();for(int i = 1;i <= n; ++i) cin>>V[i].x>>V[i].y;for(int i = 1;i <= n; ++i)for(int j = i + 1;j <= n; ++j){int w = get_len(V[i],V[j]);E[i].push_back({j,w});E[j].push_back({i,w});}DJ();cout<<"Scenario #"<<t<<endl;cout<<"Frog Distance = "<<fixed<<setprecision(3) <<(double)sqrt((double)dis[2])<<endl;cout<<endl;t++;}
}
最小生成树
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;const int N = 200+10;
int fa[N * N];int find(int x) {while(x!=fa[x]) x = fa[x];return x;
}void merge(int a,int b) {a = find(a);b = find(b);fa[b] = a;
}struct Node {double x,y;
}a[N];struct edge {int u,v;double len;
};bool cmp(edge A,edge B) {return A.len < B.len;
}
vector<edge> V;
void init() {for(int i = 1,len = N * N;i < len; ++i) {fa[i] = i;}V.clear();
}double get_len(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));
}int main()
{int cnt = 1;int n;while(~scanf("%d",&n)&&n) {init(); for(int i = 1;i <= n; ++i) {scanf("%lf%lf",&a[i].x,&a[i].y);}for(int i = 1;i <= n; ++i) {for(int j = 1;j < i; ++j) {double temp = get_len(i,j);V.push_back({i,j,temp});V.push_back({j,i,temp});}}sort(V.begin(),V.end(),cmp);for(int i = 0,len = V.size();i < len; ++i) {edge E = V[i];int l = E.u,r = E.v;l = find(l),r = find(r);if(l != r) {fa[r] = l;}if(find(1) == find(2)) {printf("Scenario #%d\n",cnt++);printf("Frog Distance = %.3lf\n\n",E.len);break;}}}return 0;
}
AcWing 4240. 青蛙(最短路 or 最小生成树)相关推荐
- 【挑战程序设计】- 2.5 图论(最短路、最小生成树)
2.5 图论(最短路.最小生成树) 文章目录 2.5 图论(最短路.最小生成树) 2.5.1 定义们 2.5.2 图的表示 2.5.3 图的搜索 2.5.4 最短路问题 单源1:bellman-for ...
- NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先
系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...
- 图论(最短路,最小生成树,并查集)
本文目录: tarjan算法(判断环) 最小生成树(Kruskal算法) 最小生成树(Prim算法) 优先队列实现dijkstra(最短路) 并查集(求环) floyd(弗洛伊德) (最短路) 判断环 ...
- acwing单源最短路的建图模式总结
.根据边权的范围以及问题求解的需要,最短路问题可以分为以下 4 种情形,分别用不同的算法求解. • 单源最短路径(固定一个顶点为原点,求源点到其他每个顶点 的最短路径) • 1. 边权非负:Dijks ...
- 20211123 HDU练习 最短路和最小生成树
一些模板题,都是dijkstra和prim 第一次写博客就复制黏贴实验报告非常抱歉,下次一定好好写.() 以后自己做的题也会写点题解吧 欢迎找我玩~ HDU Today Time Limit : 1 ...
- 【算法入门图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树
✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象
- 算法——AcWing算法提高课中代码和题解
文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...
- 【图论专题】最小生成树及其简单应用
整理的算法模板合集: ACM模板 题目列表: 题目 算法 AcWing 1140. 最短网络 prim模板 AcWing 1141. 局域网 kruskal模板 AcWing 1142. 繁忙的都市 ...
- CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树
题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...
最新文章
- 家用机器人风口来临,但巨头围猎背后的前景不容乐观
- java学习之文件基本操作
- mfc窗口右下角如何显示一个三角形图案_大型建筑,如何做到室内外设计元素统一?...
- 2013工资新规定,未来的八种人将会被淘汰!
- 与C ++中的QML对象进行交互
- Spark Streaming(二)Flume
- JavaScript 运行机制详解(理解同步、异步和事件循环)
- SpringMVC+Maven开发项目源码详细介绍
- hadoop深入学习之SequenceFile
- 安卓项目R,java文件不能自动更新,clean之后,R.java消失 (转自 Cynosure鱼)
- 【元胞自动机】基于matlab元胞自动机交通流仿真【含Matlab源码 827期】
- 关于校企合作的一些想法和思路
- 螃蟹效应:表现优秀遭嫉妒,如何应对职场竞争?
- 初次打开QQ空间后IE卡死问题处理
- 闲聊机器人实例三:python实现小姜机器人(检索式chatbot_sentence_vec_by_word_词向量句向量)
- 关于ssm框架的外文文献及译文_学术小白应该如何高效阅读文献?
- 《设计模式》(博客园精华集)
- Strategic game poj1463
- Windows 查看文件大小
- 花了2小时,搭建了一个物联网项目,值了 ~