现在的位置: 首页 > 综合 > 正文

[USACO Mar08] 混乱的齿轮

2013年09月03日 ⁄ 综合 ⁄ 共 1364字 ⁄ 字号 评论关闭

128. [USACO Mar08] 混乱的齿轮

★   输入文件:rollers.in   输出文件:rollers.out   简单对比
时间限制:1 s   内存限制:128 MB


Farmer John最近买了台新机器,来帮他做往牛棚里塞干草的体力活。但是,由于设计的不合理,机器中有很多冗余的齿轮。整个机器由一个连在电动机上的大齿轮驱动,这个齿轮被安装在位置(0,0)。FJ希望知道,在这个机器启动后,最后转动起来的齿轮是哪一个。

Image:Roller.jpg

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

输入格式:

  • 第1行: 1个整数N
  • 第2..N+1行: 第i+1行给出了齿轮i的参数:x_i,y_i,以及r_i

输入样例 (rollers.in):

3
0 0 30
30 40 20
-15 100 55

输入说明:

机器中一共有3个齿轮。第一个齿轮被放在原点,半径为30。它带动了位于(30,40)的半径为20的齿轮,于是位置为(-15,100)的半径为55的齿轮最终被第二个齿轮带动。

输出格式:

  • 第1行: 输出2个用空格隔开的整数x,y,表示传动系统末端齿轮的位置

输出样例 (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;
}

抱歉!评论已关闭.