[藍橋杯]分考場

題目描述

nn?個人參加某項特殊考試。

為了公平,要求任何兩個認識的人不能分在同一個考場。

求是少需要分幾個考場才能滿足條件。

輸入描述

輸入格式:

第一行,一個整數?nn?(1≤n≤1001≤n≤100),表示參加考試的人數。

第二行,一個整數?mm,表示接下來有?mm?行數據。

以下?mm?行每行的格式為:兩個整數?a,ba,b,用空格分開 (?1≤a,b≤n1≤a,b≤n?)表示第?aa?個人與第?bb?個人認識。

輸出描述

輸出一行一個整數,表示最少分幾個考場。

輸入輸出樣例

示例

輸入

5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5

輸出

4

運行限制

  • 最大運行時間:1s
  • 最大運行內存: 256M

總通過次數: 4611??|??總提交次數: 6677??|??通過率: 69.1%

方法思路

為了解決分考場問題(即圖的著色問題),我們需要將n個人分配到盡可能少的考場中,使得任意兩個認識的人不在同一個考場。這是一個經典的圖著色問題,我們使用回溯法(DFS)結合貪心策略和剪枝優化來解決。

解決思路

算法特點

  1. 問題建模:將每個人看作圖中的一個節點,認識關系看作邊,問題轉化為求圖的最小色數(即用最少的顏色給圖著色,相鄰節點顏色不同)。

  2. 貪心初始解:使用貪心算法(Welch-Powell算法)計算初始上界,減少回溯搜索空間。

  3. 回溯搜索:按度數降序處理節點,嘗試將每個節點分配到現有考場或新考場。

  4. 剪枝優化:當當前考場數超過已知最優解時,剪枝。

  5. 狀態更新:遞歸嘗試所有可能分配,找到最小考場數。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <climits>
    using namespace std;int n, m;
    vector<vector<int>> graph;
    vector<int> deg;
    vector<vector<int>> rooms;
    int min_rooms = INT_MAX;// 貪心著色算法:計算初始上界
    int greedyColoring(vector<int>& order) {vector<int> color(n, -1);int max_color = 0;for (int i = 0; i < n; i++) {int u = order[i];vector<bool> available(n + 1, true);for (int v = 0; v < n; v++) {if (graph[u][v] && color[v] != -1) {available[color[v]] = false;}}int c = 1;while (c <= n && !available[c]) c++;color[u] = c;max_color = max(max_color, c);}return max_color;
    }// 回溯搜索最小考場數
    void dfs(int idx, vector<int>& order) {if (rooms.size() >= min_rooms) return;  // 剪枝if (idx == n) {min_rooms = rooms.size();  // 更新最優解return;}int person = order[idx];// 嘗試放入現有考場for (int i = 0; i < rooms.size(); i++) {bool valid = true;for (int p : rooms[i]) {if (graph[person][p]) {valid = false;break;}}if (valid) {rooms[i].push_back(person);dfs(idx + 1, order);rooms[i].pop_back();}}// 嘗試新開考場rooms.push_back({person});dfs(idx + 1, order);rooms.pop_back();
    }int main() {cin >> n >> m;graph.resize(n, vector<int>(n, 0));deg.resize(n, 0);// 構建圖和度數數組for (int i = 0; i < m; i++) {int a, b;cin >> a >> b;a--; b--;  // 轉換為0-indexedgraph[a][b] = 1;graph[b][a] = 1;deg[a]++;deg[b]++;}// 創建排序索引(按度數降序)vector<int> order(n);for (int i = 0; i < n; i++) order[i] = i;sort(order.begin(), order.end(), [&](int i, int j) {return deg[i] > deg[j];});// 貪心算法獲取初始上界min_rooms = greedyColoring(order);// 回溯搜索最優解rooms.clear();dfs(0, order);cout << min_rooms << endl;return 0;
    }

    代碼解釋

  6. 輸入處理

    • 讀取人數n和認識關系數m

    • 構建鄰接矩陣graph存儲認識關系

    • 計算每個節點的度數deg

  7. 節點排序

    • 創建索引數組order

    • 按度數降序排序,優先處理度數高的節點(減少回溯分支)

  8. 貪心+回溯:先用貪心算法獲取較優解,再用回溯搜索優化

  9. 剪枝優化:當當前考場數≥已知最優解時剪枝

  10. 節點排序:按度數降序處理節點,提高剪枝效率

  11. 時間復雜度:最壞情況O(n!),但通過剪枝和貪心初始解,實際運行效率較高

    • 貪心初始解

      • greedyColoring函數實現Welch-Powell算法

      • 為每個節點分配可用最小顏色

      • 返回使用的顏色數作為初始上界

    • 回溯搜索

      • dfs函數實現回溯搜索

      • 參數idx:當前處理的節點索引(在order中)

      • 嘗試將當前節點分配到現有考場(檢查沖突)

      • 嘗試為當前節點新開考場

      • 當分配的考場數超過當前最優解時剪枝

    • 結果輸出

      • 回溯結束后輸出最小考場數min_rooms

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

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

相關文章

C++: STL簡介與string類核心技術解析及其模擬實現

目錄: 一.STL二.string類一、創建對象的6種構造方式二、常用接口解析1. 容量操作2. 元素訪問3. 修改操作4. 字符串操作 三.string模擬實現一、設計基礎&#xff1a;類結構與資源管理二、拷貝控制&#xff1a;深拷貝的三種實現1. 傳統深拷貝2. 現代寫法&#xff08;推薦&#xf…

Python進階【四】:XML和JSON文件處理

Python提供了多種處理XML和JSON文件的方式&#xff0c;讓我們來看看最常用的方法。 一、處理JSON文件 JSON在Python中處理起來非常簡單&#xff0c;因為它的結構與Python的字典(dict)和列表(list)幾乎一致。 常用模塊&#xff1a;json模塊 優點&#xff1a;Python標準庫自帶…

Golang | 搜索哨兵-對接分布式gRPC服務

哨兵&#xff08;centennial&#xff09;負責接待客人&#xff0c;直接與調用方對接。哨兵的核心組件包括service HUB和connection pool。service HUB用于與服務中心通信&#xff0c;獲取可提供服務的節點信息。connection pool用于緩存與index worker的連接&#xff0c;避免每…

CSS3實現的賬號密碼輸入框提示效果

以下是通過CSS3實現輸入框提示效果的常用方法&#xff0c;包含浮動標簽和動態提示兩種經典實現方案&#xff1a; 一、浮動標簽效果 <div class"input-group"><input type"text" required><label>用戶名</label> </div><…

maven編譯時跳過test過程

如果代碼里有無法在打包環境中測試的部分&#xff0c;則直接運行mvn clean package&#xff0c;因為測試失敗&#xff0c;會導致打包失敗。目前有兩種方式可以跳過測試&#xff1a; 1. mvn clean package -DskipTests&#xff0c;這會跳過執行階須&#xff0c;但仍會生成測試所…

美業+智能體,解鎖行業轉化新密碼(2/6)

摘要&#xff1a;中國美業市場近年蓬勃發展&#xff0c;規模持續擴大&#xff0c;預計不久將突破萬億級別&#xff0c;但同時也面臨著諸多挑戰&#xff0c;如獲客成本攀升、服務質量不穩定、難以滿足消費者多元化個性化需求等。智能體技術的出現為美業帶來了新的發展機遇&#…

設計模式——責任鏈設計模式(行為型)

摘要 責任鏈設計模式是一種行為型設計模式&#xff0c;旨在將請求的發送者與接收者解耦&#xff0c;通過多個處理器對象按鏈式結構依次處理請求&#xff0c;直到某個處理器處理為止。它包含抽象處理者、具體處理者和客戶端等核心角色。該模式適用于多個對象可能處理請求的場景…

react/vue移動端項目,刷新頁面404的原因以及解決辦法

一 、 項目 移動端 二、背景 1、問題描述&#xff1a;react/vue移動端項目&#xff0c;正常的頁面操作跳轉&#xff0c;不會出現404的問題&#xff0c;但是一旦刷新&#xff0c;就會出現404報錯 2、產生原因&#xff1a; React Router是客戶端的路由&#xff0c;當再次刷新時…

數據結構-算法學習C++(入門)

目錄 03二進制和位運算04 選擇、冒泡、插入排序05 對數器06 二分搜索07 時間復雜度和空間復雜度08 算法和數據結構09 單雙鏈表09.1單雙鏈表及反轉09.2合并鏈表09.2兩數相加09.2分隔鏈表 013隊列、棧、環形隊列013.1隊列013.2棧013.3循環隊列 014棧-隊列的相互轉換014.1用棧實現…

用JS實現植物大戰僵尸(前端作業)

1. 先搭架子 整體效果&#xff1a; 點擊開始后進入主場景 左側是植物卡片 右上角是游戲的開始和暫停鍵 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

深入理解設計模式之代理模式

深入理解設計模式之&#xff1a;代理模式 一、什么是代理模式&#xff1f; 代理模式&#xff08;Proxy Pattern&#xff09;是一種結構型設計模式。它為其他對象提供一種代理以控制對這個對象的訪問。代理對象在客戶端和目標對象之間起到中介作用&#xff0c;可以在不改變目標…

Ubuntu設置之初始化

安裝SSH服務 # 安裝 OpenSSH Server sudo apt update sudo apt install -y openssh-server# 檢查 SSH 服務狀態 sudo systemctl status ssh # Active: active (running) since Sat 2025-05-31 17:13:07 CST; 6s ago# 重啟服務 sudo systemctl restart ssh自定義分辨率 新…

【仿生機器人】極具前瞻性的架構——認知-情感-記憶“三位一體的仿生機器人系統架構

基于您的深度需求分析&#xff0c;我將為您設計一個全新的"認知-情感-記憶"三位一體的仿生機器人系統架構。以下是經過深度優化的解決方案&#xff1a; 一、核心架構升級&#xff08;三體認知架構&#xff09; 采用量子糾纏式架構設計&#xff1a; 認知三角&#xf…

Python量化交易12——Tushare全面獲取各種經濟金融數據

兩年前寫過Tushare的簡單使用&#xff1a; Python量化交易08——利用Tushare獲取日K數據_skshare- 現在更新一下吧&#xff0c;這兩年用過不少的金融數據庫&#xff0c;akshare&#xff0c;baostock&#xff0c;雅虎的&#xff0c;pd自帶的......發現還是Tushare最穩定最好用&…

python打卡day39@浙大疏錦行

知識點回顧 圖像數據的格式&#xff1a;灰度和彩色數據模型的定義顯存占用的4種地方 模型參數梯度參數優化器參數數據批量所占顯存神經元輸出中間狀態 batchisize和訓練的關系 1. 圖像數據格式 - 灰度圖像 &#xff1a;單通道&#xff0c;像素值范圍通常0-255&#xff0c;形狀為…

源碼解析(二):nnUNet

原文 &#x1f600; nnU-Net 是一個用于生物醫學圖像分割的自配置深度學習框架&#xff0c;可自動適應不同的數據集。可用于處理和訓練可能規模龐大的二維和三維醫學圖像。該系統分析數據集屬性并配置優化的基于 U-Net 的分割流程&#xff0c;無需手動參數調整或深度學習專業知…

clickhouse如何查看操作記錄,從日志來查看寫入是否成功

背景 插入表數據后&#xff0c;因為原本表中就有數據&#xff0c;一時間沒想到怎么查看插入是否成功&#xff0c;因為對數據源沒有很多的了解&#xff0c;這時候就想怎么查看下插入是否成功呢&#xff0c;于是就有了以下方法 具體方法 根據操作類型查找&#xff0c;比如inse…

udp 傳輸實時性測量

UDP&#xff08;用戶數據報協議&#xff09;是一種無連接的傳輸協議&#xff0c;適用于實時性要求較高的應用&#xff0c;如視頻流、音頻傳輸和游戲等。測量UDP傳輸的實時性可以通過多種工具和方法實現&#xff0c;以下是一些常見的方法和工具&#xff1a; 1. 使用 iperf 測試…

pikachu通關教程- over permission

如果使用A用戶的權限去操作B用戶的數據&#xff0c;A的權限小于B的權限&#xff0c;如果能夠成功操作&#xff0c;則稱之為越權操作。 越權漏洞形成的原因是后臺使用了 不合理的權限校驗規則導致的。 水平越權 當我們以Lucy賬號登錄&#xff0c;查詢個人信息時&#xff0c;會有…

nc 命令示例

nc -zv 實用示例 示例 1&#xff1a;測試單個 TCP 端口&#xff08;最常見&#xff09; 目標&#xff1a; 檢查主機 webserver.example.com 上的 80 端口 (HTTP) 是否開放。 nc -zv webserver.example.com 80成功輸出&#xff1a; Connection to webserver.example.com (19…