NO.91十六屆藍橋杯備戰|圖論基礎-圖的存儲和遍歷|鄰接矩陣|vector|鏈式前向星(C++)

圖的基本概念

圖的定義

圖G是由頂點集V和邊集E組成,記為G = (V, E),其中V(G)表?圖G中頂點的有限?空集;E(G)表?圖G中頂點之間的關系(邊)集合。若 V = { v 1 , v 2 , … , v n } V = \left\{ v_{1},v_{2},\dots,v_{n} \right\} V={v1?,v2?,,vn?},則? ∣ V ∣ |V| V
?圖G中頂點的個數,也稱圖G的階, E = ( u , v ) ∣ u ∈ V , v ∈ V E = {(u,v)|u \in V, v \in V} E=(u,v)uV,vV,? ∣ E ∣ |E| E表?圖G中邊的條數。
圖是較線性表和樹更為復雜的數據結構。

  • 線性表中,除第?個和最后?個元素外,每個元素只有?個唯?的前驅和唯?的后繼結點,元素和元素之間是?對?的關系;
  • 在樹形結構中,數據元素之間有著明顯的層次關系,每個元素有唯?的雙親,但可能有多個孩?,元素和元素之間是?對多的關系;
  • ?圖形結構中,元素和元素之間的關系更加復雜,結點和結點之間的關系是任意的,任意兩個結點之間都可能相關,圖中元素和元素之間是多對多的關系
    ![[Pasted image 20250411210928.png]]
有向圖和?向圖

圖根據邊的類型,可以分為?向圖和有向圖
![[Pasted image 20250411211513.png]]

在圖相關的算法中,我們可以將?向圖中的邊看成兩條?向相反的有向邊,從?將?向圖轉化為有向圖
![[Pasted image 20250411211622.png]]

簡單圖與多重圖

?環:??指向??的?條邊
![[Pasted image 20250411211640.png]]

重邊:圖中存在兩個或兩個以上完全相同的邊
![[Pasted image 20250411211811.png]]

簡單圖:若圖中沒有重邊和?環,為簡單圖。
多重圖:若圖中存在重邊或?環,為多重圖。
![[Pasted image 20250411211832.png]]

稠密圖和稀疏圖

有很少條邊(如e < nlog2 n )的圖稱為稀疏圖,反之稱為稠密圖
![[Pasted image 20250411211857.png]]

頂點的度

頂點v的度是指與它相關聯的邊的條數,記作deg(v)。由該頂點發出的邊稱為頂點的出度,到達該頂點的邊稱為頂點的?度。

  • ?向圖中,頂點的度等于該頂點的?度(indev)和出度(outdev),即deg(v)=indeg(v)=outdeg(v)。
  • 有向圖中,頂點的度等于該頂點的?度與出度之和,其中頂點v的?度indeg(v)是以v為終點的有向邊的條數,頂點v的出度outdeg(v)是以v為起始點的有向邊的條數,deg(v)=indeg(v)+outdeg(v)
    ![[Pasted image 20250411212011.png]]
路徑

在圖G=(V,E)中,若從頂點 v i v_{i} vi?出發,沿?些邊經過某些頂點 v p 1 , v p 2 , … , v p m v_{p1},v_{p2},\dots,v_{pm} vp1?,vp2?,,vpm?,到達頂點 v j v_{j} vj?。則稱頂點序列 ( v i , v p 1 , v p 2 , … , v p m , v j ) (v_{i},v_{p1},v_{p2},\dots,v_{pm},v_{j}) (vi?,vp1?,vp2?,,vpm?,vj?)為從頂點 v i v_{i} vi?到頂點 v j v_{j} vj?的路徑。
注意:兩個頂點間的路徑可能不唯?
![[Pasted image 20250411212248.png]]

簡單路徑與回路

若路徑上各頂點 v 1 , v 2 , … , v m v_{1},v_{2},\dots,v_{m} v1?,v2?,,vm?均不重復,則稱這樣的路徑為簡單路徑。若路徑上第?個頂點 v 1 v_{1} v1?和最后?個頂點 v m v_{m} vm?相同,則稱這樣的路徑為回路或環
![[Pasted image 20250411212403.png]]

路徑?度和帶權路徑?度

某些圖的邊具有與它相關的數值,稱其為該邊的權值。這些權值可以表?兩個頂點間的距離、花費的代價、所需的時間等。?般將該種帶權圖稱為?絡
![[Pasted image 20250411212509.png]]

對于不帶權的圖,?條路徑的路徑?度是指該路徑上的邊的條數。
對于帶權的圖,?條路徑的路徑?度是指該路徑上各個邊權值的總和。
![[Pasted image 20250411212521.png]]

?圖

設圖 G = { V , E } G = \left\{ V, E\right\} G={V,E}和圖 G ′ = { V ′ , E ′ } G' = \left\{ V',E' \right\} G={V,E},若 V ′ ∈ V V'\in V VV E ′ ∈ E E'\in E EE,則稱 G ′ G' G G G G的?圖。若有 V ( G ′ ) = V ( G ) V(G')=V(G) V(G)=V(G)的?圖 G ′ G' G,則稱 G ′ G' G G G G的?成?圖。
相當于就是在原來圖的基礎上,拿出來?些頂點和邊,組成?個新的圖。但是要注意,拿出來的點和邊要能構成?個圖才?
![[Pasted image 20250411212748.png]]

G1_1和G1_2為?向圖G1的?圖,G1_1為G1的?成?圖。
G2_1和G2_2為有向圖G2的?圖,G2_1為G2的?成?圖。

連通圖與連通分量

在?向圖中,若從頂點 v 1 v_{1} v1?到頂點 v 2 v_{2} v2?有路徑,則稱頂點 v 1 v_{1} v1?與頂點 v 2 v_{2} v2?是連通的。如果圖G中任意?對頂點都是連通的,則圖G稱為連通圖,否則稱為?連通圖。

  • 假設?個圖有n個頂點,如果邊數?于n-1,那么此圖?定是?連通圖。
  • 極?聯通?圖:?向圖中,拿出?個?圖,這個?圖包含盡可能多的點和邊。
  • 連通分量:?向圖中的極?連通?圖稱為連通分量
    ![[Pasted image 20250411212932.png]]
?成樹

連通圖的?成樹是包含圖中全部頂點的?個極?連通?圖。若圖中頂點數為n,則它的?成樹含有n-1條邊。對?成樹??,若砍去?條邊,則會變成?連通圖,若加上?條邊則會形成?個回路
![[Pasted image 20250411213241.png]]

圖的存儲和遍歷

圖的存儲有兩種:鄰接矩陣和鄰接表:

  • 其中,鄰接表的存儲?式與樹的孩?表?法完全?樣。因此,?vector數組以及鏈式前向星就能實現。
  • ?鄰接矩陣就是??個?維數組,其中edges[i][j]存儲頂點 i 與頂點 j 之間,邊的信息。
    圖的遍歷分兩種:DFS和BFS,和樹的遍歷?式以及實現?式完全?樣。因此,可以仿照樹這個數據結構來學習
鄰接矩陣

鄰接矩陣,指??個矩陣(即?維數組)存儲圖中邊的信息(即各個頂點之間的鄰接關系),存儲頂點之間鄰接關系的矩陣稱為鄰接矩陣。
對于帶權圖??,若頂點 v i v_{i} vi? v j v_{j} vj?之間有邊相連,則鄰接矩陣中對應項存放著該邊對應的權值,若頂點 v i v_{i} vi? v j v_{j} vj?不相連,則? ∞ \infty 來代表這兩個頂點之間不存在邊。
對于不帶權的圖,可以創建?個?維的bool類型的數組,來標記頂點vi 和vj 之間有邊相連
![[Pasted image 20250411214010.png]]

矩陣中元素個數為nxn,即空間復雜度為O(n^2) ,n為頂點個數,和實際邊的條數?關,適合存儲稠密圖

#include <iostream>  
#include <cstring>  
using namespace std;  
const int N = 1010;  
int n, m;  
int edges[N][N];  
int main()  
{  memset(edges, -1, sizeof edges);  cin >> n >> m; // 讀?結點個數以及邊的個數  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a - b 有?條邊,權值為 c  edges[a][b] = c;  // 如果是?向邊,需要反過來再存?下  edges[b][a] = c;  }return 0;  
}
vector數組

和樹的存儲?模?樣,只不過如果存在邊權的話,我們的vector數組??放?個結構體或者是pair即可。

#include <iostream>  
#include <vector>  using namespace std;  
typedef pair<int, int> PII;  
const int N = 1e5 + 10;  
int n, m;  
vector<PII> edges[N];  int main()  
{  cin >> n >> m; // 讀?結點個數以及邊的個數  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a 和 b 之間有?條邊,權值為 c  edges[a].push_back({b, c});  // 如果是?向邊,需要反過來再存?下  edges[b].push_back({a, c});  }  return 0;  
}
鏈式前向星

和樹的存儲?模?樣,只不過如果存在邊權的話,我們多創建?維數組,?來存儲邊的權值即可

#include <iostream>  
using namespace std;  
const int N = 1e5 + 10;  
// 鏈式前向星  
int h[N], e[N * 2], ne[N * 2], w[N * 2], id;  
int n, m;  
// 其實就是把 b 頭插到 a 所在的鏈表后?  
void add(int a, int b, int c)  
{  id++;  e[id] = b;  w[id] = c; // 多存?個權值信息  ne[id] = h[a];  h[a] = id;  
}  
int main()  
{  cin >> n >> m; // 讀?結點個數以及邊的個數  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a 和 b 之間有?條邊,權值為 c  add(a, b, c); add(b, a, c);  }  return 0;  
}
DFS

和樹的遍歷?式?模?樣,?條路?到?

  1. ?鄰接矩陣的?式存儲
#include <iostream>  
#include <cstring>  
#include <queue>  
using namespace std;  
const int N = 1010;  
int n, m;  
int edges[N][N];  
bool st[N]; // 標記哪些點已經訪問過  
void dfs(int u)  
{  cout << u << endl;  st[u] = true;  // 遍歷所有孩?  for(int v = 1; v <= n; v++)  {  // 如果存在 u->v 的邊,并且沒有遍歷過  if(edges[u][v] != -1 && !st[v])  {  dfs(v);  }  }  
}  int main()  
{  memset(edges, -1, sizeof edges);  cin >> n >> m; // 讀?結點個數以及邊的個數  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a - b 有?條邊,權值為 c  edges[a][b] = c;  // 如果是?向邊,需要反過來再存?下  edges[b][a] = c;  }return 0;  
}
  1. ?vector數組的?式存儲
#include <iostream>  
#include <vector>  
#include <queue>  
using namespace std;  
typedef pair<int, int> PII;  
const int N = 1e5 + 10;  
int n, m;  
vector<PII> edges[N];  
bool st[N]; // 標記哪些點已經訪問過  
void dfs(int u)  
{  cout << u << endl;  st[u] = true;  // 遍歷所有孩?  for(auto& t : edges[u])  {  // u->v 的?條邊,權值為 w  int v = t.first, w = t.second;  if(!st[v])  {  dfs(v);  }  }  
}  int main()  
{  cin >> n >> m; // 讀?結點個數以及邊的個數  for(int i = 1; i <= m; i++){  int a, b, c; cin >> a >> b >> c;  // a 和 b 之間有?條邊,權值為 c  edges[a].push_back({b, c});  // 如果是?向邊,需要反過來再存?下  edges[b].push_back({a, c});  }  return 0;  
}
  1. ?鏈式前向星的?式存儲
#include <iostream>  
#include <queue>  
using namespace std;  
const int N = 1e5 + 10;  
// 鏈式前向星  
int h[N], e[N * 2], ne[N * 2], w[N * 2], id;  
int n, m;  
// 其實就是把 b 頭插到 a 所在的鏈表后?  
void add(int a, int b, int c)  
{  id++;  e[id] = b;  w[id] = c; // 多存?個權值信息  ne[id] = h[a];  h[a] = id;  
}  bool st[N];  void dfs(int u)  
{  cout << u << endl;  st[u] = true;// 遍歷所有的孩?  for(int i = h[u]; i; i = ne[i])  {  // u->v 的?條邊  int v = e[i];  if(!st[v])  {  dfs(v);  }  }  
}  
int main()  
{  cin >> n >> m; // 讀?結點個數以及邊的個數  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a 和 b 之間有?條邊,權值為 c  add(a, b, c); add(b, a, c);  }  return 0;  
}
BFS
  1. ?鄰接矩陣的?式存儲
#include <iostream>  
#include <cstring>  
#include <queue>  
using namespace std;  
const int N = 1010;  
int n, m;  
int edges[N][N];
bool st[N]; // 標記哪些點已經訪問過  
void bfs(int u)  
{  queue<int> q;  q.push(u);  st[u] = true;  while(q.size())  {  auto a = q.front(); q.pop();  cout << a << endl;  for(int b = 1; b <= n; b++)  {  if(edges[a][b] != -1 && !st[b])  {  q.push(b);  st[b] = true;  }  }  }  
}  int main()  
{  memset(edges, -1, sizeof edges);  cin >> n >> m; // 讀?結點個數以及邊的個數  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a - b 有?條邊,權值為 c  edges[a][b] = c;  // 如果是?向邊,需要反過來再存?下  edges[b][a] = c;  }  return 0;  
}
  1. ?vector數組的?式存儲
#include <iostream>  
#include <vector>  
#include <queue>  
using namespace std;  
typedef pair<int, int> PII;  
const int N = 1e5 + 10;  
int n, m;  
vector<PII> edges[N];  
bool st[N]; // 標記哪些點已經訪問過  
void bfs(int u)  
{  queue<int> q;  q.push(u);  st[u] = true;  while(q.size())  {  auto a = q.front(); q.pop();  cout << a << endl;  for(auto& t : edges[a])  {  int b = t.first, c = t.second;  if(!st[b])  {  q.push(b);  st[b] = true;  }  }  }  
}  int main()  
{  cin >> n >> m; // 讀?結點個數以及邊的個數  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;// a 和 b 之間有?條邊,權值為 c  edges[a].push_back({b, c});  // 如果是?向邊,需要反過來再存?下  edges[b].push_back({a, c});  }  return 0;  
}
  1. ?鏈式前向星的?式存儲
#include <iostream>  
#include <queue>  
using namespace std;  
const int N = 1e5 + 10;  
// 鏈式前向星  
int h[N], e[N * 2], ne[N * 2], w[N * 2], id;  
int n, m;  
// 其實就是把 b 頭插到 a 所在的鏈表后?  
void add(int a, int b, int c)  
{  id++;  e[id] = b;  w[id] = c; // 多存?個權值信息  ne[id] = h[a];  h[a] = id;  
}  bool st[N];  void bfs(int u)  
{  queue<int> q;  q.push(u);  st[u] = true;  while(q.size(){  auto a = q.front(); q.pop();  cout << a << endl;  for(int i = h[a]; i; i = ne[i])  {  int b = e[i], c = w[i];  if(!st[b])  {  q.push(b);  st[b] = true;  }  }  }  
}  
int main()  
{  cin >> n >> m; // 讀?結點個數以及邊的個數  for(int i = 1; i <= m; i++)  {  int a, b, c; cin >> a >> b >> c;  // a 和 b 之間有?條邊,權值為 c  add(a, b, c); add(b, a, c);  }  return 0;  
}

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

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

相關文章

【項目日記(一)】-仿mudou庫one thread oneloop式并發服務器實現

1、模型框架 客戶端處理思想&#xff1a;事件驅動模式 事件驅動處理模式&#xff1a;誰觸發了我就去處理誰。 &#xff08; 如何知道觸發了&#xff09;技術支撐點&#xff1a;I/O的多路復用 &#xff08;多路轉接技術&#xff09; 1、單Reactor單線程&#xff1a;在單個線程…

Go語言實現OAuth 2.0認證服務器

文章目錄 1. 項目概述1.1 OAuth2 流程 2. OAuth 2.0 Storage接口解析2.1 基礎方法2.2 客戶端管理相關方法2.3 授權碼相關方法2.4 訪問令牌相關方法2.5 刷新令牌相關方法 2.6 方法調用時序2.7 關鍵注意點3. MySQL存儲實現原理3.1 數據庫設計3.2 核心實現 4. OAuth 2.0授權碼流程…

結合 Python 與 MySQL 構建你的 GenBI Agent_基于 MCP Server

寫在前面 商業智能(BI)正在經歷一場由大型語言模型(LLM)驅動的深刻變革。傳統的 BI 工具通常需要用戶學習復雜的界面或查詢語言,而生成式商業智能 (Generative BI, GenBI) 則旨在讓用戶通過自然語言與數據交互,提出問題,并獲得由 AI 生成的數據洞察、可視化建議甚至完整…

Linux中常用命令

目錄 1. linux目錄結構 2. linux基本命令操作 2.1 目錄操作命令 2.2 文件操作命令 2.3 查看登錄用戶命名 2.4 文件內容查看命令 2.5 系統管理類命令 3. bash通配符 4. 壓縮與解壓縮命令 4.1 壓縮和解壓縮 4.2 測試網絡連通性命令 ping 4.3 vi編輯器 4.4 管道操作(…

C++ 與 MySQL 數據庫優化實戰:破解性能瓶頸,提升應用效率

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

tcp特點+TCP的狀態轉換圖+time_wait詳解

tcp特點TCP的狀態轉換圖time wait詳解 目錄 一、tcp特點解釋 1.1 面向連接 1.1.1 連接建立——三次握手 1.1.2 連接釋放——四次揮手 1.2 可靠的 1.2.1 應答確認 1.2.2 超時重傳 1.2.3 亂序重排 1.2.4 去重 1.2.5 滑動窗口進行流量控制 1.3 流失服務&#xff08;字節…

探秘 Ruby 與 JavaScript:動態語言的多面風采

1 語法特性對比&#xff1a;簡潔與靈活 1.1 Ruby 的語法優雅 Ruby 的語法設計旨在讓代碼讀起來像自然語言一樣流暢。它擁有簡潔而富有表現力的語法結構&#xff0c;例如代碼塊、符號等。 以下是一個使用 Ruby 進行數組操作的簡單示例&#xff1a; # 定義一個數組 numbers [1…

點評項目回顧

表結構 基于Session實現登錄流程 發送驗證碼&#xff1a; 用戶在提交手機號后&#xff0c;會校驗手機號是否合法&#xff0c;如果不合法&#xff0c;則要求用戶重新輸入手機號 如果手機號合法&#xff0c;后臺此時生成對應的驗證碼&#xff0c;同時將驗證碼進行保存&#xf…

OpenShift介紹,跟 Kubernetes ,Docker關系

1. OpenShift 簡介 OpenShift是一個開源項目,基于主流的容器技術Docker及容器編排引擎Kubernetes構建。可以基于OpenShift構建屬于自己的容器云平臺。OpenShift的開源社區版本叫OpenShift Origin,現在叫OKD。 OpenShift 項目主頁:https://www.okd.io/。OpenShift GitHub倉庫…

Ubuntu服務器性能調優指南:從基礎工具到系統穩定性提升

一、性能監控工具的三維應用 1.1 監控矩陣構建 通過組合工具搭建立體監控體系&#xff1a; # 實時進程監控 htop --sort-keyPERCENT_CPU# 存儲性能采集 iostat -dx 2# 內存分析組合拳 vmstat -SM 1 | awk NR>2 {print "Active:"$5"MB Swpd:"$3"…

計算機視覺——基于MediaPipe實現人體姿態估計與不良動作檢測

概述 正確的身體姿勢是個人整體健康的關鍵。然而&#xff0c;保持正確的身體姿勢可能會很困難&#xff0c;因為我們常常會忘記。本博客文章將逐步指導您構建一個解決方案。最近&#xff0c;我們使用 MediaPipe POSE 進行身體姿勢檢測&#xff0c;效果非常好&#xff01; 一、…

LSTM結合LightGBM高緯時序預測

1. LSTM 時間序列預測 LSTM 是 RNN&#xff08;Recurrent Neural Network&#xff09;的一種變體&#xff0c;它解決了普通 RNN 訓練時的梯度消失和梯度爆炸問題&#xff0c;適用于長期依賴的時間序列建模。 LSTM 結構 LSTM 由 輸入門&#xff08;Input Gate&#xff09;、遺…

六、adb通過Wifi連接

背景 收集是榮耀X40,數據線原裝全新的&#xff0c;USB連上之后&#xff0c;老是斷&#xff0c;電腦一直叮咚叮咚的響個不停&#xff0c;試試WIFI 連接是否穩定&#xff0c;需要手機和電腦用相同的WIFI. 連接 1.通過 USB 連接手機和電腦(打開USB調試等這些都略過) adb device…

如何理解前端開發中的“換皮“

"換皮"在前端開發中是一個常見的術語&#xff0c;通常指的是在不改變網站或應用核心功能和結構的情況下&#xff0c;只改變其外觀和視覺表現。以下是關于前端"換皮"的詳細理解&#xff1a; 基本概念 定義&#xff1a;換皮(Skinning)是指保持應用程序功能不…

從 Vue 到 React:深入理解 useState 的異步更新

目錄 從 Vue 到 React&#xff1a;深入理解 useState 的異步更新與函數式寫法1. Vue 的響應式回顧&#xff1a;每次賦值立即生效2. React 的狀態更新是異步且批量的原因解析 3. 函數式更新&#xff1a;唯一的正確寫法4. 對比 Vue vs React 狀態更新5. React useState 的核心源碼…

使用Redis實現分布式限流

一、限流場景與算法選擇 1.1 為什么需要分布式限流 在高并發系統中&#xff0c;API接口的突發流量可能導致服務雪崩。傳統的單機限流方案在分布式環境下存在局限&#xff0c;需要借助Redis等中間件實現集群級流量控制。 1.2 令牌桶算法優勢 允許突發流量&#xff1a;穩定速…

快速搭建WordPress網站的主題

WP快主題(wpkuai.com )是一款由知名WordPress專業團隊打造的專業化WordPress主題&#xff0c;旨在讓用戶使用該wordpress主題快速搭建網站。 WP快主題專注于快速搭建WordPress網站的主題解決方案。其主題設計注重簡潔性與高效性&#xff0c;旨在幫助用戶快速完成網站的搭建和部…

STM32江科大----------PID算法

聲明&#xff1a;本人跟隨b站江科大學習&#xff0c;本文章是觀看完視頻后的一些個人總結和經驗分享&#xff0c;也同時為了方便日后的復習&#xff0c;如果有錯誤請各位大佬指出&#xff0c;如果對你有幫助可以點個贊小小鼓勵一下&#xff0c;本文章建議配合原視頻使用?? 如…

將JSON格式的SQL查詢轉換為完整SQL語句的實戰解析

一、背景與需求 在現代數據處理中,JSON格式因其靈活性和可讀性,常被用于定義SQL查詢的結構。然而,直接編寫JSON格式的SQL指令后,如何將其轉換為可執行的SQL語句是開發者常遇到的挑戰。本文將通過一個Python函數和多個實際案例,解析如何將JSON結構轉換為完整的SQL語句,并…

java CountDownLatch用法簡介

CountDownLatch倒計數鎖存器 CountDownLatch&#xff1a;用于協同控制一個或多個線程等待在其他線程中執行的一組操作完成&#xff0c;然后再繼續執行 CountDownLatch用法 構造方法&#xff1a;CountDownLatch(int count)&#xff0c;count指定等待的條件數&#xff08;任務…