POJ2253
2016-04-22 23:35
127 查看
大致题意就是给定1,2和多个点,问从1到2的每条路径中的最大边的最小的那一条边的值是多少。
#include <iostream> #include <queue> #include <cstdio> #include <vector> #include <algorithm> #include <cmath> #include <cstring> #include <set> #define INF 5000000 using namespace std; typedef long long ll; const int maxn=250; int n,m; bool vis[maxn]; double dis[maxn]; double e[maxn][maxn]; pair<int,int>stone[maxn]; double getdis(int x1,int y1,int x2,int y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } double dijkstra()//寻找从1到i的中多条路径中最小的最大边 { for(int i=1;i<=n;i++) dis[i]=e[1][i]; vis[1]=1; for(int i=0;i<n-1;i++) { int mn=INF,s=-1; for(int j=1;j<=n;j++) if(!vis[j]&&dis[j]<mn) mn=dis[s=j];//从1-s的最小的最大边已经固定 if(s==-1) break; vis[s]=1; for(int j=1;j<=n;j++) { if(vis[j]) continue; if(dis[j]>e[s][j]&&dis[j]>dis[s])//这里是关键吧.... { dis[j]=max(e[s][j],dis[s]); } } } return dis[2]; } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif int cases=1; while(scanf("%d",&n),n>0) { for(int i=1;i<=n;i++) scanf("%d%d",&stone[i].first,&stone[i].second); for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) e[i][j]=e[j][i]=getdis(stone[i].first,stone[i].second,stone[j].first,stone[j].second); e[i][i]=0; } e =0; printf("Scenario #%d\nFrog Distance = %.3f\n\n", cases++, dijkstra()); memset(vis,0,sizeof(vis)); } return 0; }
相关文章推荐
- 一个三流城市小团队程序员的随笔(1)
- 类加载器
- 【OpenCV】功能:展示OpenCV的图像绘制功能
- <css 十八>图片的透明
- UVA - 414 Machined Surfaces
- 20150131--XML上
- ExpandableListView的使用
- Knight Moves(HDU 1372)(BFS)
- POJ_3185_The_Water_Bowls_(反转)
- hdoj BestCoder Round #81 (div.2) AA Machine
- BestCoder Round #81 (div.2)-String(尺取法)
- linux基础优化
- 【dp】NOIP2010提高组乌龟棋
- VS2010中为OpenCV工程创建属性单
- ios - 纯代码创建collectionView
- Android JNI总结
- mac ulimit
- ceshi
- MATLAB函数运算
- [codevs]模板-二叉树基础