返回列表 發帖

2022 B-防盜雷達

B-防盜雷達
時間限制 1 秒 / 記憶體限制 1 G
某國國防部想要架設⾶彈偵測系統。
此系統由多個雷達組成,並且雷達與雷之間以無線網路串接。
當⾶彈來襲時,⼀但有雷達偵測到⾶彈,就會透過網路傳輸給其他所有的雷達。
由於如果相鄰的雷達之間使⽤相同的無線電波頻率,會造成訊號⼲擾。
因此若有保持系統正常運⾏,所有相鄰的雷達都必須使⽤不同的無線電波頻率。
另外,任兩個雷達之間都⼀定可以傳輸資料給對⽅,並且路徑唯⼀。
為了使成本下降,國防部想要知道最少需要使⽤多少種不同的無線電波頻率。
● 輸入說明
第⼀⾏輸入兩個整數N和M分別代表總共有N個雷達 (編號1~N),以及總共有M組相鄰的雷
達。
接下來有M⾏,每⾏皆有兩個整數Xi,Yi代表雷達Xi與雷達Yi相鄰。

● 輸出說明
請輸出最少需要使⽤多少種不同的無線電波頻率。
範例輸入1
3 2
1 2
1 3
範例輸出1
2
範例輸入2
4 3
1 2
2 3
3 4
範例輸出2
2
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊
May

回復 1# may
  1. #include<bits/stdc++.h>
  2. #define int long long //確保變數能夠處理較大的數值範圍,避免溢位。
  3. using namespace std;
  4. int n,m;
  5. signed main()//因#define int long long而main 函數必須傳回一個int 值,所以不能使用int main()。通常使用signed main,因為signed 等效替代於signed int,也就是有符號整數,這與int 別無二致,並且不會導致奇怪的CE。
  6. {
  7.     int a,b,ans=0;
  8.     cin>>n>>m;
  9.     vector<int> path[n+1];//path[i]:儲存與雷達 i 相鄰的所有雷達編號,n+1:確保陣列索引從 1 開始,與輸入數據一致。
  10.     int freq[n+1]={0}; //freq[i]:雷達 i 被分配的頻率值,初始化為 0,表示尚未分配頻率。
  11.     for(int i=0;i<m;i++)
  12.     {
  13.         cin>>a>>b;
  14.         path[b].push_back(a);
  15.         path[a].push_back(b);
  16.     }
  17.     for(int i=1;i<=n;i++)
  18.     {
  19.         set<int> s;   //set容器是用二元搜尋樹實現的一種集合,集合中每種元素只出現一次。count()是set容器中常用的函數。
  20.         for(int j=0;j<path[i].size();j++)
  21.             s.insert(freq[path[i][j]]);//建立 set<int> s,用來存放與 i 相鄰的雷達已經使用的頻率。freq[path[i][j]]:代表相鄰雷達 path[i][j] 的頻率,將這些頻率存入 set 中。
  22.         int index=1;
  23.         while(s.count(index))// set::count() 是C++ STL中的内置函数,它返回元素在集合中出现的次数。由于set容器仅包含唯一元素,因此只能返回1或0。
  24.             index++;
  25.         freq[i]=index;
  26.         ans=max(ans,index);
  27.     }
  28.     cout<<ans<<endl;
  29.     return 0;
  30. }
複製代碼
----------------------------------------------
正確解法:使用 BFS 來檢查是否需要 2 或 1 種顏色
因為:

樹一定是連通的,且無環

樹總是二分圖(最多需要 2 種顏色)

我們可以用 BFS 或 DFS 來二分著色:

如果整棵樹只有 1 個節點,那麼只需要 1 種顏色。

否則,因為樹是二分圖,最少需要 2 種顏色。
------------------------------------------
解釋
建立鄰接表:

讀取 N 和 M。

用 adj[X].push_back(Y) 來存儲連接關係。

使用 BFS 進行二分著色:

用 queue<int> 來進行廣度優先搜索(BFS)。

color 存儲每個節點的顏色(1 或 2)。

若相鄰節點還沒染色,就賦予不同顏色,並加入隊列繼續搜尋。

輸出 2:

除非 N == 1,否則樹必定是二分圖,只需 2 種顏色。

時間複雜度分析
建構鄰接表: O(N)

BFS 遍歷所有節點: O(N)

總時間複雜度: O(N)
------------------------------
測資:
測資00:最小測資 (只有 1 個雷達)
輸入
1 0
預期輸出
1
解析:只有 1 個雷達,僅需 1 種頻率。

測資 01:鏈狀樹
輸入
5 4
1 2
2 3
3 4
4 5
預期輸出
2
解析:這是一條線狀樹,像這樣:
1 - 2 - 3 - 4 - 5
可以使用交替頻率(例如 1, 2, 1, 2, 1),因此最多只需要 2 種頻率。

測資 02:星狀樹
輸入
6 5
1 2
1 3
1 4
1 5
1 6
預期輸出
2
解析:這是 星狀樹,所有雷達都連接到節點 1:
    2
    |
    1 - 3
    |
    4
    |
    5
    |
    6
可以讓 1 使用顏色 1,其他所有相鄰節點 (2, 3, 4, 5, 6) 使用顏色 2,所以只需要 2 種顏色。

測資 03:完全二元樹
輸入
7 6
1 2
1 3
2 4
2 5
3 6
3 7
預期輸出
2
解析:這是一棵二元樹:

       1
      / \
     2   3
    / \  / \
   4  5 6  7
根節點 1 使用顏色 1

2 和 3 使用顏色 2

4, 5, 6, 7 使用顏色 1

因此只需要 2 種頻率。

測資 04:隨機樹
輸入
8 7
1 2
1 3
2 4
2 5
3 6
3 7
6 8
預期輸出
2
解析:
       1
      / \
     2   3
    / \  / \
   4   5 6  7
          |
          8
仍然是二分圖,最多只需要 2 種頻率。

這 5 筆測資涵蓋了: ✅ 最小情況 (N=1)
✅ 線性結構(鏈狀樹)
✅ 星狀樹
✅ 完全二元樹
✅ 隨機樹
May

TOP

返回列表