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;}



原创粉丝点击