POJ2253 Frogger 最短路变形
来源:互联网 发布:神奇的印度人 知乎 编辑:程序博客网 时间:2024/05/16 19:56
题意:给你n块石头的坐标,有两只青蛙分别在一号石头和二号石头上。一号青蛙想
去找二号青蛙,求他所走的最短路上的最大跳跃距离是多少。
分析:和POJ 1797那题类似,这里是求最短路的最大值,那题是求最大路径的最小值。
也给出kruskal和spfa两种方法。
kruskal,对所有的边按小到大排序,直到1和2连接(在一个集合),此时这条边就是要求的。
/*求最短路上的最大跳跃距离*/#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<cstring>#include<cstdio>#include<cmath>const int INF=1<<30;typedef long long LL;using namespace std;const int maxn=215;struct Point{int x,y;}P[maxn];struct Edge{int s,e; //起点,终点,权值 double w;Edge(){}Edge(int _s,int _e,double _w):s(_s),e(_e),w(_w){}bool operator <(const Edge &v)const{return w<v.w; } };vector<Edge> edges;vector<int> par;int T,N,M;int GetRoot(int a){return par[a]==a?a:par[a]=GetRoot(par[a]);}void Merge(int a,int b){int p1=GetRoot(a);int p2=GetRoot(b);if(p1==p2) return;par[p2]=p1;}double GetW(Point a,Point b){return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))); //注意一定要把sqrt()函数的参数强转成double类型,否则会CE}int main(){//freopen("E:\\ACM\\test.txt","r",stdin);int t=1;while(cin>>N,N){ int s,e;double w;edges.clear();par.clear();for(int i=0;i<=N;i++) par.push_back(i);for(int i=1;i<=N;i++) cin>>P[i].x>>P[i].y;for(int i=1;i<=N;i++) {for(int j=i;j<=N;j++){w=GetW(P[i],P[j]);edges.push_back(Edge(i,j,w));edges.push_back(Edge(j,i,w));}}sort(edges.begin(),edges.end()); //边权值按小到大排序 double ans=0;for(int i=0;i<edges.size();i++){Merge(edges[i].s,edges[i].e);if(GetRoot(1)==GetRoot(2)){ans=edges[i].w;break;}}if(t!=1) puts("");printf("Scenario #%d\nFrog Distance = ",t++);printf("%.3lf\n",ans);}return 0;}
spfa
/*求最短路上的最大跳跃距离*/#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<cstring>#include<cstdio>#include<cmath>const int INF=1<<20;typedef long long LL;using namespace std;const int maxn=205;struct Point{int x,y;}P[maxn];struct Edge{int e;double w;Edge(){}Edge(int _e,double _w):e(_e),w(_w){}};double dist[maxn];vector<Edge> G[maxn];int T,N,M;void spfa(int v){for(int i=0;i<=N;i++) dist[i]=INF;queue<int> q;dist[v]=0;q.push(v);while(!q.empty()){int s=q.front();q.pop();for(int i=0;i<G[s].size();i++){int e=G[s][i].e;if(max(dist[s],G[s][i].w)<dist[e]) //若能拓展 {dist[e]=max(dist[s],G[s][i].w);q.push(e);}}}}double GetW(Point a,Point b){return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))); //注意一定要把sqrt()函数的参数强转成double类型,否则会CE}int main(){//freopen("E:\\ACM\\test.txt","r",stdin);int t=1;while(cin>>N,N){for(int i=1;i<=N;i++) cin>>P[i].x>>P[i].y;for(int i=0;i<maxn;i++) G[i].clear();double w;for(int i=1;i<=N;i++) {for(int j=i;j<=N;j++){w=GetW(P[i],P[j]);G[i].push_back(Edge(j,w));G[j].push_back(Edge(i,w));}}spfa(1);if(t!=1) puts("");printf("Scenario #%d\nFrog Distance = ",t++);printf("%.3lf\n",dist[2]);}return 0;}
阅读全文
0 0
- poj2253 Frogger(最短路变形)
- POJ2253 Frogger 最短路变形
- poj2253 - Frogger(最短路变形)
- POJ2253---Frogger(最短路变形)
- POJ2253 Frogger(最短路变形,floyd,Dijkstra,spfa)
- POJ2253&ZOJ1942--Frogger【SPFA】单源最短路变形
- POJ2253--Frogger FLOYD【最小树变形】
- POJ2253 Frogger -DIJKSTRA || FLOYD最短路练习
- POJ2253 Frogger(floyd最短路算法)
- poj2253~Frogger(最短路floyd)
- Frogger(最短路_floyd变形)
- Frogger(poj2253)-floyd变形
- poj2253 Frogger +poj1797Heavy Transpotaion(最短路dijkstra变式)
- 【POJ2253】【Frogger】【dij变形题】
- 最短路变形 POJ 2253 Frogger
- POJ 2253 Frogger -- 最短路变形
- POJ 2253 Frogger(最短路--floyd变形)
- POJ 2253 Frogger(最短路变形)
- Linux 查询网络状态和设置wlan相关
- 架构师日记——Varnish简介和安装
- CSU 1972:大梵天的恩赐(递推)
- 【javascript】javascript中,怎么在数组中删除一个指定的元素 -- 史上最快、最短方法
- SDK中关于HttpURLConnection.setDoInput(true)和HttpURLConnection.setDoOutput(true)的描述
- POJ2253 Frogger 最短路变形
- Redis主从和HA配置
- 排序算法系列-交换之冒泡排序
- 前端开发ajax请求失败或错误提示的解决办法
- HDU 6040 Hints of sd0061(nth_element)
- 对象数组排序&&对象数组去除重复数据
- (9)从站会开始
- 类的转换
- [日常训练] 独立集