题意:这道题题有点坑一开始没看懂什么叫最坏情况。其实就是任意两点之中距离最大的,就是最坏情况。
思路:floyd模版题,ps:竟然这次写跪了然后调试了半天T。T真是忧伤。。。
首先根据给的点建图然后在建图过程中滤去>10的边。然后floyd,接着判断一下连通性,不连通直接输出Send Kurdy。否则输出最大值。
这道题写的有点烦了。。。就不改了直接贴上来了。见谅
代码如下:
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #define LEN 11012 #define INF -1000113 #define eps 1E-1014 15 using namespace std;16 17 typedef pair pdd;18 int n ,cnt = 1;19 pdd p[LEN];20 double Map[LEN][LEN], dd[LEN][LEN];21 22 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));}23 int parent[LEN];24 void init(){ for(int i=0; i dd[i][k]+dd[k][j]){35 dd[i][j] = dd[i][k]+dd[k][j];36 }37 }38 }39 }40 }41 42 int main()43 {44 // freopen("in.txt", "r", stdin);45 46 int T;47 scanf("%d", &T);48 while(T--){49 scanf("%d", &n);50 for(int i=1; i<=n; i++){51 double a, b;52 scanf("%lf%lf", &a, &b);53 p[i] = make_pair(a,b);54 }55 for(int i=1; i<=n; i++){56 for(int j=1; j<=n; j++){57 Map[i][j] = dis(p[i],p[j]);58 if(Map[i][j]>10)Map[i][j] = -INF;59 }60 }61 floyd();62 printf("Case #%d:\n", cnt++);63 double ans = INF;64 for(int i=1; i<=n; i++){65 for(int j=1; j<=n; j++){66 if(fabs(dd[i][j]+INF)>eps)ans = max(ans, dd[i][j]);67 }68 }69 init();70 for(int i=1; i<=n; i++){71 for(int j=1; j<=n; j++){72 if(dd[i][j]!=-INF)Union(i,j);73 }74 }75 int f=0;76 for(int i=1; i<=n; i++)if(parent[i]==i)f++;77 if(f==1)printf("%.4lf\n\n", ans);78 else printf("Send Kurdy\n\n");79 }80 return 0;81 }