【http://noi.openjudge.cn/】4.3算法之圖論——1538:Gopher II

@[【http://noi.openjudge.cn/】4.3算法之圖論——1538:Gopher II]

題目

查看提交統計提問
總時間限制: 2000ms 內存限制: 65536kB
描述
The gopher family, having averted the canine threat, must face a new predator.

The are n gophers and m gopher holes, each at distinct (x, y) coordinates. A hawk arrives and if a gopher does not reach a hole in s seconds it is vulnerable to being eaten. A hole can save at most one gopher. All the gophers run at the same velocity v. The gopher family needs an escape strategy that minimizes the number of vulnerable gophers.
輸入
The input contains several cases. The first line of each case contains four positive integers less than 100: n, m, s, and v. The next n lines give the coordinates of the gophers; the following m lines give the coordinates of the gopher holes. All distances are in metres; all times are in seconds; all velocities are in metres per second.
輸出
Output consists of a single line for each case, giving the number of vulnerable gophers.
樣例輸入
2 2 5 10
1.0 1.0
2.0 2.0
100.0 100.0
20.0 20.0
樣例輸出
1

翻譯

**題目:**地鼠II
描述:
地鼠家族在避免了犬科動物的威脅后,必須面對一個新的捕食者。
有n個地鼠洞和m個地鼠洞,每個洞都位于不同的(x,y)坐標處。一只鷹來了,如果地鼠在s秒內沒有到達一個洞,它很容易被吃掉。一個洞最多只能救一只地鼠。所有的地鼠都以相同的速度奔跑。地鼠家族需要一種逃生策略,以盡量減少易受攻擊的地鼠數量。
輸入:
輸入包含幾個案例。每種情況的第一行包含四個小于100的正整數:n、m、s和v。接下來的n行給出地鼠的坐標;以下m線給出了地鼠洞的坐標。所有距離均以米為單位;所有時間均以秒為單位;所有速度均以米每秒為單位。
輸出:
輸出由每種情況的單行組成,給出了易受攻擊的地鼠數量。
例如:
在語言模型中,編碼器和解碼器都是由一個個的 Transformer 組件拼接在一起形成的。

代碼

#include <bits/stdc++.h>
using namespace std;
struct point {double x, y;int id,oid;vector<point*> h;point() { x = 0; y = 0;oid=0;}//成員要初始化,否則會"runtime error" point(int idx, double px, double py) : id(idx), oid(0), x(px), y(py) {}
}one[210];
bool k[210];
int n, m, s, v,ans;
double x, y;
void view(int x,point* p){cout<<x<<endl;cout<<"坐標"<<p->x<<","<<p->y<<endl; cout<<"可達目標:\n";for(vector<point*>::iterator i=p->h.begin();i!=p->h.end();i++)cout<<"("<<(*i)->x<<","<<(*i)->y<<")\t";cout<<"選中"<<p->oid<<endl;
}
void view(){for(int i=n+1;i<=n+m;i++){cout<<i<<"坐標"<<one[i].x<<","<<one[i].y<<"\t"<<"達"<<one[i].oid<<endl;	} cout<<endl;
}
bool go(point *p){//該老鼠能否找到洞__匈牙利算法,進行二分圖匹配 for(vector<point*>::iterator i=p->h.begin();i!=p->h.end();i++){//該老鼠能達的洞 if(k[(*i)->id])continue;//該洞已經用過了 k[(*i)->id]=1;//標記該洞,此老鼠不能再用該洞了 if(!(*i)->oid||go(&one[(*i)->oid])){//該洞沒用過或者該洞本來的老鼠可以找到別的洞 (*i)->oid=p->id;//該洞被該老鼠占用 return 1;}}return 0;
} 
int main() {//freopen("data.cpp", "r", stdin);while(cin >> n >> m ){//題目講The input contains several cases. 有多組數據 ans=0; memset(one, 0, sizeof(one));cin>> s >> v;for (int i = 1; i <=n; i++) {//遍歷每個老鼠 cin >> x >> y; one[i] = point(i,x,y);}for (int i = 1; i <=m; i++) {//遍歷每個鼠洞 cin >> x >> y; one[n+i] = point(n+i, x,y );for (int j = 1; j <=n; j++) {//遍歷每個老鼠 double xg = one[j].x, yg = one[j].y;if ((x - xg)* (x - xg) + (y - yg)* (y - yg) <= (s * v)* (s * v)){//看哪些老鼠可以跑進哪個洞 one[n+i].h.push_back(&one[j]);//該老鼠可以跑到該洞 one[j].h.push_back(&one[n+i]);//該洞成為該老鼠的一個選項 }}	}for (int i = 1; i <=n; i++){//遍歷每個老鼠 memset(k,0,sizeof(k));//清空深搜標記 if(go(&one[i]))ans++;//判定該老鼠能否找到洞 //view(i,&one[i]);//view();}//view();cout << n-ans<<endl;	}return 0;
}

細節

  • 題目說有多組數據,The input contains several cases。
  • 結構體內元素一定要初始化,否則會提示runtime error
struct point {double x, y;int id,oid;vector<point*> h;point() { x = 0; y = 0;oid=0;}//成員要初始化,否則會"runtime error" point(int idx, double px, double py) : id(idx), oid(0), x(px), y(py) {}
}one[210];

-在結構體內,每個老鼠可以躲藏的洞可以用指針描述,堅決落實。

deep seek對過程進行的分析:

初始狀態
老鼠:
老鼠 1:(0.0, 3.0)
老鼠 2:(0.0, 2.0)
老鼠 3:(0.0, 1.0)
鼠洞:
鼠洞 1:(0.0, 51.0)(未占用)
鼠洞 2:(0.0, 52.0)(未占用)
鼠洞 3:(0.0, 53.0)(未占用)
匹配結果:ans = 0
步驟 1:匹配老鼠 1
老鼠 1嘗試匹配:
嘗試鼠洞 1:
鼠洞 1 未占用,直接匹配。
匹配成功!
更新狀態:
鼠洞 1 被老鼠 1 占用。
ans = 1。
步驟 2:匹配老鼠 2
老鼠 2嘗試匹配:
嘗試鼠洞 1:
鼠洞 1 已被老鼠 1 占用,無法直接匹配。
遞歸調用:嘗試為老鼠 1 尋找其他鼠洞。
遞歸過程:
老鼠 1 嘗試鼠洞 2:
鼠洞 2 未占用,直接匹配。
匹配成功!
更新狀態:
鼠洞 1 被老鼠 2 占用。
鼠洞 2 被老鼠 1 占用。
ans = 2。
步驟 3:匹配老鼠 3
老鼠 3嘗試匹配:
嘗試鼠洞 1:
鼠洞 1 已被老鼠 2 占用,無法直接匹配。
遞歸調用:嘗試為老鼠 2 尋找其他鼠洞。
遞歸過程:
老鼠 2 嘗試鼠洞 2:
鼠洞 2 已被老鼠 1 占用,無法直接匹配。
遞歸調用:嘗試為老鼠 1 尋找其他鼠洞。
老鼠 1 嘗試鼠洞 3:
鼠洞 3 未占用,直接匹配。
匹配成功!
更新狀態:
鼠洞 1 被老鼠 3 占用。
鼠洞 2 被老鼠 2 占用。
鼠洞 3 被老鼠 1 占用。
ans = 3。
最終狀態
匹配結果:
老鼠 1 → 鼠洞 3
老鼠 2 → 鼠洞 2
老鼠 3 → 鼠洞 1
最終答案:ans = 3

算法

一群老鼠避難,在一堆洞里找藏身處(一洞一老鼠,老鼠只能在規定時間跑到一部分洞里),求最優化,就是更多的老鼠能找到洞。這種兩個集合配對問題就是二分圖問題。
思路就是找洞,如果該洞被占有了,煩請它去找別的洞(增廣路徑),找不到就不挪窩,找到了就挪。
這就是最早是由兩位匈牙利數學家 Dénes K?nig 和 Jen? Egerváry 在 20 世紀 30 年代提出的匈牙利算法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70927.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70927.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70927.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache Spark中的依賴關系與任務調度機制解析

Apache Spark中的依賴關系與任務調度機制解析 在Spark的分布式計算框架中,RDD(彈性分布式數據集)的依賴關系是理解任務調度、性能優化及容錯機制的關鍵。寬依賴(Wide Dependency)與窄依賴(Narrow Dependency)作為兩種核心依賴類型,直接影響Stage劃分、Shuffle操作及容…

【計算機網絡】TCP協議相關總結,TCP可靠性的生動講解

TCP 可靠性 確保快遞不丟、不亂、不過載 機制作用&#xff08;快遞類比&#xff09;防止的問題檢驗和檢查包裹是否損壞&#xff0c;損壞就重新發數據出錯序列號給每個包裹編號&#xff0c;按順序整理亂序、重復確認應答每送到一件&#xff0c;就讓收件人簽收丟失滑動窗口控制…

Go基于協程池的延遲任務調度器

原理 通過用一個goroutine以及堆來存儲要待調度的延遲任務&#xff0c;當達到調度時間后&#xff0c;將其添加到協程池中去執行。 主要是使用了chan、Mutex、atomic及ants協程池來實現。 用途 主要是用于高并發及大量定時任務要處理的情況&#xff0c;如果使用Go協程來實現每…

杰發科技AC7801——滴答定時器獲取時間戳

1. 滴答定時器 杰發科技7801內部有一個滴答定時器&#xff0c;該定時器是M0核自帶的&#xff0c;因此可以直接用該定時器來獲取時間戳。 同樣&#xff0c;7803也可以使用該方式獲取時間戳。 2. 滴答定時器原理 SysTick是一個24位的遞減計數器&#xff0c;它從預設的重裝載值…

湖倉一體概述

湖倉一體之前&#xff0c;數據分析經歷了數據庫、數據倉庫和數據湖分析三個時代。 首先是數據庫&#xff0c;它是一個最基礎的概念&#xff0c;主要負責聯機事務處理&#xff0c;也提供基本的數據分析能力。 隨著數據量的增長&#xff0c;出現了數據倉庫&#xff0c;它存儲的是…

第十五屆藍橋杯單片機組4T模擬賽三(第二套)

本套試題在4T平臺中的名字為第15屆藍橋杯單片機組模擬考試三&#xff0c;不知道哪套是4T的模擬賽&#xff0c;所以兩套都敲一遍練練手感。 為了代碼呈現美觀&#xff0c;本文章前面的各個模塊在main函數中的處理函數均未添加退出處理&#xff0c;在最后給出的完整代碼中體現。 …

CT技術變遷史——CT是如何誕生的?

第一代CT(平移-旋轉) X線球管為固定陽極,發射X線為直線筆形束,一個探測器,采用直線和旋轉掃描相結合,即直線掃描后,旋轉1次,再行直線掃描,旋轉180完成一層面掃描,掃描時間3~6分鐘。矩陣象素256256或320320。僅用于顱腦檢查。 第二代CT (平移-旋轉) 與第一代無質…

Virtual Box虛擬機安裝蘋果Monterey和big sur版本實踐

虛擬機安裝蘋果實踐&#xff0c;在Windows10系統&#xff0c;安裝Virtual Box7.1.6&#xff0c;安裝虛擬蘋果Monterey版本Monterey (macOS 12) 。碰到的主要問題是安裝光盤不像Windows那么容易拿到&#xff0c;而且根據網上很多文章制作的光盤&#xff0c;在viritualBox里都無法…

dify基礎之prompts

摘要&#xff1a;在大型語言模型&#xff08;LLM&#xff09;應用中&#xff0c;Prompt&#xff08;提示詞&#xff09;是連接用戶意圖與模型輸出的核心工具。本文從概念、組成、設計原則到實踐案例&#xff0c;系統講解如何通過Prompt解鎖LLM的潛能&#xff0c;提升生成內容的…

【學寫LibreCAD】0 仿寫LibreCAD簡介

一、LibreCAD 核心模塊&#xff1a; 核心模塊&#xff08;Core&#xff09; 功能&#xff1a;處理 CAD 的核心邏輯&#xff0c;如幾何計算、圖形對象管理、坐標系轉換等。關鍵組件&#xff1a; 圖形對象&#xff1a;如直線、圓、圓弧、多段線等。數學工具&#xff1a;向量、矩…

HTML元素,標簽到底指的哪塊部分?單雙標簽何時使用?

1. 標簽&#xff08;Tag&#xff09; vs 元素&#xff08;Element&#xff09; 標簽&#xff08;Tag&#xff09; 標簽是 HTML 中用于定義元素的符號&#xff0c;用尖括號 < > 包裹。例如 <img> 是標簽。元素&#xff08;Element&#xff09; 元素是由 標簽 內容…

Android APK組成編譯打包流程詳解

Android APK&#xff08;Android Package&#xff09;是 Android 應用的安裝包文件&#xff0c;其組成和打包流程涉及多個步驟和文件結構。以下是詳細的說明&#xff1a; 一、APK 的組成 APK 是一個 ZIP 格式的壓縮包&#xff0c;包含應用運行所需的所有文件。解壓后主要包含以…

Token相關設計

文章目錄 1. 雙Token 機制概述1.1 訪問令牌&#xff08;Access Token&#xff09;1.2 刷新令牌&#xff08;Refresh Token&#xff09; 2. 雙Token 認證流程3. Spring Boot 具體實現3.1 生成 Token&#xff08;使用 JWT&#xff09;3.2 解析 Token3.3 登錄接口&#xff08;返回…

HTTP 請求時傳遞多部分表單數據

HTTP 請求時傳遞多部分表單數據&#xff08;multipart/form-data&#xff09; --data-raw $------demo11111\r\nContent-Disposition: form-data; name"Filedata"; filename"截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n\r\n------d…

Java基礎關鍵_013_日期處理

目 錄 一、傳統 API 1.System.currentTimeMillis() &#xff08;1&#xff09;說明 &#xff08;2&#xff09;實例 2.構造方法 &#xff08;1&#xff09;說明 &#xff08;2&#xff09;無參構造 &#xff08;3&#xff09;有參構造 3.日期格式化 &#xff08;1&am…

51單片機中reg52.h與regx52.h在進行位操作時的不同

reg52.h中不能使用例如 P2_0;這樣的定義 而只能使用 P2^0;這樣的定義 但是都不可以對位進行直接賦值操作&#xff1b; 而 regx52.h中可以使用 P2_0和P2^0&#xff1b;但是只有使用下劃線的才可以對位進行賦值操作 例如P2_0 1; 但不可以是P2^0 1; 在 C 語言中&#xff0c;…

基于Rook的Ceph云原生存儲部署與實踐指南(上)

#作者&#xff1a;任少近 文章目錄 1 Ceph環境準備2 rook部署ceph群集2.1 Rook 幫助地址2.2 安裝ceph2.3 獲取csi鏡像2.4 Master參加到osd2.5 設置默認存儲 3 Rook部署云原生RBD塊存儲3.1 部署storageclass資源3.2 部署WordPress使用RBD3.3 WordPress訪問 4 Rook部署云原生RGW…

FastExcel與Reactor響應式編程深度集成技術解析

一、技術融合背景與核心價值 在2025年企業級應用開發中&#xff0c;大規模異步Excel處理與響應式系統架構的結合已成為技術剛需。FastExcel與Reactor的整合方案&#xff0c;通過以下技術協同實現突破性性能&#xff1a; 內存效率革命&#xff1a;FastExcel的流式字節操作與Re…

DeepSeek R1/V3滿血版——在線體驗與API調用

前言&#xff1a;在人工智能的大模型發展進程中&#xff0c;每一次新模型的亮相都宛如一顆投入湖面的石子&#xff0c;激起層層波瀾。如今&#xff0c;DeepSeek R1/V3 滿血版強勢登場&#xff0c;為大模型應用領域帶來了全新的活力與變革。 本文不但介紹在線體驗 DeepSeek R1/…

Spring Data JPA 中的分頁實現:從 BasePage 到 Pageable

文章目錄 Spring Data JPA 中的分頁實現&#xff1a;從 BasePage 到 Pageable背景&#xff1a;為什么需要分頁&#xff1f;認識 BasePage 類深入 toPageable() 方法1. 處理頁碼和頁面大小2. 處理排序方向3. 處理排序字段4. 生成 Pageable 對象 實戰&#xff1a;如何使用 BasePa…