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 ...