2019杭電複試第四題

2021-10-05 02:17:01 字數 1652 閱讀 2291

4.找朋友。假設a是b的朋友,那麼b也是a的朋友,c與b為朋友,則c與a也為朋友,另外,自己與自己也是朋友。輸入乙個數n,代表人數,緊接著輸入乙個n*n的矩陣,1代表兩個人是朋友,0代表兩個人不是朋友。求有幾個朋友圈。

(ps: 演算法筆記p332 有道類似的題)

例:input:

該問題是乙個無向圖尋找連通塊的數量問題

將每個朋友當成乙個頂點,即有編號為0~n-1的頂點,其中某些頂點彼此相連,求其中連通塊的數量

可以用dfs/bfs/並查集三種方法做。建議三種方法都熟練一下。

#includeusing namespace std;

const int maxn = 1000; //假設n不超過1000.若n>1000可以使用鄰接矩陣

int n; //頂點數

int g[maxn][maxn];

bool vis[maxn] = ;

//深度優先搜尋頂點編號u

void dfs(int u)

} }int main()

printf("%d\n", res);

return 0;

}

方法二:bfs

#include#includeusing namespace std;

const int maxn = 1000;

int n;

int g[maxn][maxn];

bool vis[maxn] = ;

void bfs(int s)

}int main()

int res = 0;

for(int i = 0; i < n; i++)

} printf("%d\n", res);

return 0;

}

方法三:並查集

#includeusing namespace std;

const int maxn = 1000;

int n; //頂點數

int father[maxn]; //father[i] = j 表示頂點i所在集合編號為j

bool isroot[maxn] = ; //isroot[i]記錄頂點i是否是根

//查詢頂點x所在的集合

int findfather(int x)

//路徑壓縮

while(u != father[u])

return x;

}//將a, b所在集合合併

void union(int a, int b)

int main()

} }for(int i = 0; i < n; i++)

int res = 0;

for(int i = 0; i < n; i++)

printf("%d\n", res);

return 0;

}

17年杭電複試第三題

試題三 有乙個 mn 的材料和乙個 st 的模板,從材料中切除模板,求最大能切出 來的模板的數量。sample input 3 4a b c d c d a b a c c d 2 2a b c dsample out 2以下 逃離地球的小小呆 include include include inc...

3 7 杭電復試題2011

1 輸入三個正整數 a b c,判斷這三個數能不能構成乙個三角形。includeint i,a,b,c void swap int m,int n void main 2.有個人從 2003 年 1 月 1 日開始,三天打魚兩天曬網,請輸入月份 日期,問在當年的某一天他是在打魚還是在曬網。inclu...

3 12 杭電復試題2013

1.簡要描述 輸入乙個數,代表要檢測的例子的個數,每個例子中 輸入兩 個時間 格式 hh mm ss 前面時間減去後面時間輸出在時鐘上顯示的時間,格 式一樣,如果是以為數字的前面補零。includeint h1,h2,h3,m1,m2,m3,s1,s2,s3 void main void sort ...