zoj 2887 || poj 3439 Server Relocation

哎,开始没理解清题意,后来想明白了^ ^。不难~

 

给你一个服务器,服务器有两条电线,电线长度给你了,墙上有好多个插座,问你从插座A移动到插座B最少要几步(移动的时候,服务器不能断电,也就是,至少有一条电线连着插座,服务器可以任意动)。

 

开始理解错误了,这个蛮简单的,只要俩插座之间的距离大于两条电线的总长度,就不予考虑。然后建图后,求最短路,或者用BFS也可以,求最小次数即可。

 

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; const int MAX = 1010; double len[2],ll; typedef struct COOR{ double x,y; }COOR; COOR c[MAX]; bool map[MAX][MAX]; double dis(int i,int k) { return ( c[i].x - c[k].x ) * ( c[i].x - c[k].x ) + (c[i].y - c[k].y) * (c[i].y - c[k].y); } int Dijkstra(int s,int t ,int n) { int ttt[MAX]; fill(ttt,ttt+n+1,INT_MAX); bool used[MAX]; memset(used,0,sizeof(used)); ttt[s] = 0; used[s] = true; int now = s; for(int i=0; i<n; i++) { for(int k=1; k<=n; k++) if( map[now][k] && ttt[k] > ttt[now] + 1 ) ttt[k] = ttt[now] + 1 ; int min = INT_MAX; for(int k=1; k<=n; k++) if( !used[k] && ttt[k] < min ) min = ttt[now = k]; used[now] = true; } return ttt[t]; } int main() { int nblocks,ncases,n,s,t; scanf("%d",&nblocks); while( nblocks-- ) { scanf("%d",&ncases); while( ncases-- ) { scanf("%d %d %d %lf %lf",&n,&s,&t,&len[0],&len[1]); memset(map,false,sizeof(map)); double ll = len[0] + len[1]; ll *= ll; for(int i=1; i<=n; i++) scanf("%lf %lf",&c[i].x,&c[i].y); for(int i=1; i<=n; i++) for(int k=i+1; k<=n; k++) { double l = dis(i,k); if( l > ll ) continue; map[i][k] = map[k][i] = 1; } int ans = Dijkstra(s,t,n); if( ans == INT_MAX ) printf("Impossible/n"); else printf("%d/n",ans); } } return 0; }  

你可能感兴趣的:(c,server,struct,服务器)