128. [USACO Mar08] 混亂的齒輪
★ 輸入檔案:rollers.in 輸出檔案:rollers.out 簡單對比
時間限制:1 s 記憶體限制:128 MB
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
輸入格式:
- 第2..N+1行: 第i+1行給出了齒輪i的參數:x_i,y_i,以及r_i
輸入範例 (rollers.in):
30 0 3030 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;}