您的位置:首页 > 其它

uva 10803(floyd)

2013-12-11 23:03 351 查看
题意:这道题题有点坑一开始没看懂什么叫最坏情况。其实就是任意两点之中距离最大的,就是最坏情况。

思路:floyd模版题,ps:竟然这次写跪了然后调试了半天T。T真是忧伤。。。

首先根据给的点建图然后在建图过程中滤去>10的边。然后floyd,接着判断一下连通性,不连通直接输出Send Kurdy。否则输出最大值。

这道题写的有点烦了。。。就不改了直接贴上来了。见谅

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <utility>
#include <queue>
#include <stack>
#include <vector>
#define LEN 110
#define INF -10001
#define eps 1E-10

using namespace std;

typedef pair<double, double> pdd;
int n ,cnt = 1;
pdd p[LEN];
double Map[LEN][LEN], dd[LEN][LEN];

inline double dis(pdd a, pdd b){return sqrt((a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second));}
int parent[LEN];
void init(){for(int i=0; i<LEN; i++)parent[i] = i;}
int Find(int x){return parent[x]==x?x:Find(parent[x]);}
void Union(int a, int b){int pa=Find(a), pb=Find(b);if(pa!=pb)parent[pa] = pb;}

void floyd()
{
memcpy(dd, Map, sizeof Map);
for(int k=1; k<=n; k++){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(dd[i][j]>dd[i][k]+dd[k][j]){
dd[i][j] = dd[i][k]+dd[k][j];
}
}
}
}
}

int main()
{
//    freopen("in.txt", "r", stdin);

int T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i=1; i<=n; i++){
double a, b;
scanf("%lf%lf", &a, &b);
p[i] = make_pair(a,b);
}
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
Map[i][j] = dis(p[i],p[j]);
if(Map[i][j]>10)Map[i][j] = -INF;
}
}
floyd();
printf("Case #%d:\n", cnt++);
double ans = INF;
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(fabs(dd[i][j]+INF)>eps)ans = max(ans, dd[i][j]);
}
}
init();
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(dd[i][j]!=-INF)Union(i,j);
}
}
int f=0;
for(int i=1; i<=n; i++)if(parent[i]==i)f++;
if(f==1)printf("%.4lf\n\n", ans);
else printf("Send Kurdy\n\n");
}
return 0;
}


View Code

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: