128. [USACO Mar08] 混乱的齿轮
★ 输入文件:rollers.in
输出文件:
rollers.out
简单对比
时间限制:1 s 内存限制:128 MB
- 第1行: 1个整数N
- 第2..N+1行: 第i+1行给出了齿轮i的参数:x_i,y_i,以及r_i
- 第1行: 输出2个用空格隔开的整数x,y,表示传动系统末端齿轮的位置
Farmer John最近买了台新机器,来帮他做往牛棚里塞干草的体力活。但是,由于设计的不合理,机器中有很多冗余的齿轮。整个机器由一个连在电动机上的大齿轮驱动,这个齿轮被安装在位置(0,0)。FJ希望知道,在这个机器启动后,最后转动起来的齿轮是哪一个。
FJ详尽地记录了所有N (2 <= N <= 1080)个齿轮的位置x_i,y_i (-5,000 <= x_i <= 5,000; -5,000 <= y_i <= 5,000)和半径r_i (3 <= r_i <= 1024)。你的任务是,找出整个传动系统末端的齿轮(一个被其他齿轮带动,但没有带动其他任何装置的齿轮)的位置。除了驱动整个机器的大齿轮,其他齿轮 都只会被另一个齿轮带动。
程序名: rollers
输入格式:
输入样例 (rollers.in):
3 0 0 30 30 40 20 -15 100 55
输入说明:
机器中一共有3个齿轮。第一个齿轮被放在原点,半径为30。它带动了位于(30,40)的半径为20的齿轮,于是位置为(-15,100)的半径为55的齿轮最终被第二个齿轮带动。
输出格式:
输出样例 (rollers.out):
-15 100
根据题意直接建图。然后BFS。
#include<cstdio> #include<queue> using namespace std; const int maxn = 1100; int x[maxn],y[maxn],r[maxn]; int f[maxn][maxn]; bool vis[maxn]; int dist(int x1,int y1,int x2,int y2){ return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); } int s,ans,n; void bfs(){ queue<int > q; q.push(s); vis[s]=true; while(!q.empty()){ int now = q.front();q.pop(); for(int i=1;i<=n;i++){ if(!vis[i]&&f[now][i]){ vis[i]=true; ans=i; q.push(i); } } } } int main(){ freopen("rollers.in","r",stdin); freopen("rollers.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&x[i],&y[i],&r[i]); if(x[i]==0&&y[i]==0){ s=i; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i!=j){ int s=dist(x[i],y[i],x[j],y[j]); if(s<=(r[i]+r[j])*(r[i]+r[j])){ f[i][j]=1; } } } } bfs(); printf("%d %d\n",x[ans],y[ans]); return 0; }