已知有n個節點,和m條連線兩個節點的線條。需要移動幾條線使得所有的節點通過線條可以達到其他的節點?
若給出的圖是乙個極大連通圖,則不需要進行任何操作。反之,表示當前的圖存在不止乙個連通子圖。如果有多餘的線條,則可以將幾個子圖進行連線。需要移動的線條數則為連通子圖 的個數-1。
什麼時候有多餘的線條?
所以可以轉化為求連通子圖的個數。有兩種方法:圖的深度優先搜尋遍歷和並查集
圖的深度優先搜尋遍歷(dfs)類似於二叉樹的先序遍歷。
1.首先訪問出發點v,並將其標記為已訪問過;
2.然後選取與v連線的未被訪問的任意乙個頂點w,並訪問它;
3.再選取與w鄰接的未被訪問過的頂點,並訪問,以此重複。
4.當乙個頂點的所有的鄰接點都被訪問過時,則依次退回到最近被訪問過的頂點。若該頂點還有其他鄰接點未被訪問,則從這些為被訪問的頂點中取乙個並重複上述訪問過程,直至圖中所有頂點都被訪問過為止。
深度優先:
class
solussion
edges=
newlist
[n];
used=
newboolean
[n];
for(
int i =
0;i++i)
for(
int[
] conn:connections)
int result=0;
for(
int i=
0;i++i)
}return result-1;
}public
void
dfs(
int v)}}
}
並查集:
//定義乙個並查集
class
unionfind
}public
intfindset
(int x)
public
boolean
unite
(int x,
int y)
if(size[y]
>size[x]
) parent[y]
=x; size[x]
+=size[y]
;--setcount;
return
true;}
}//根據給的節點數,與邊的資訊,來判斷
class
solussion
unionfind uf=
newunionfind
(n);
for(
int[
] conn:connections)
return uf.setcount-1;
}}
1319 連通網路的操作次數
1319 連通網路的操作次數 用乙太網線纜將 n 臺計算機連線成乙個網路,計算機的編號從 0 到 n 1。線纜用 connections 表示,其中 connections i a,b 連線了計算機 a 和 b。網路中的任何一台計算機都可以通過網路直接 或者間接訪問同乙個網路中其他任意一台計算機。給...
最少操作次數的簡易版
給定兩個字串,僅由小寫字母組成,它們包含了相同字元。求把第乙個字串變成第二個字串的最小操作次數,且每次操作只能對第乙個字串中的某個字元移動到此字串中的開頭。例如給定兩個字串 abcd bcad 輸出 2,因為需要操作2次才能把 abcd 變成 bcad 方法是 abcd cabd bcad。incl...
1319 連通網路的操作次數 並查集
用乙太網線纜將 n 臺計算機連線成乙個網路,計算機的編號從 0 到 n 1。線纜用 connections 表示,其中 connections i a,b 連線了計算機 a 和 b。網路中的任何一台計算機都可以通過網路直接或者間接訪問同乙個網路中其他任意一台計算機。給你這個計算機網路的初始佈線 co...