MCPcopy Create free account
hub / github.com/E869120/math-algorithm-book / main

Function main

codes/c/Code_4_05_2_stack.c:16–90  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

14bool visited[100009];
15
16int main() {
17 // 入力
18 scanf("%d%d", &N, &M);
19 int i;
20 for (i = 1; i <= M; i++) {
21 scanf("%d%d", &A[i], &B[i]);
22 }
23
24 // 各頂点の次数を数える(手順 1.)
25 for (i = 1; i <= N; i++) degree[i] = 0;
26 for (i = 1; i <= M; i++) {
27 degree[A[i]] += 1;
28 degree[B[i]] += 1;
29 }
30
31 // 隣接リスト G の構築(手順 2.)
32 for (i = 1; i <= N; i++) {
33 G[i] = (int*)malloc(degree[i] * sizeof(int));
34 }
35
36 // G に辺の情報を追加していく(手順 3.)
37 for (i = 1; i <= N; i++) cnt[i] = 0;
38 for (i = 1; i <= M; i++) {
39 G[A[i]][cnt[A[i]]] = B[i];
40 cnt[A[i]] += 1;
41 G[B[i]][cnt[B[i]]] = A[i];
42 cnt[B[i]] += 1;
43 }
44
45
46 // スタック S の定義
47 // スタックの中身が S[0], S[1], ..., S[SZ - 1] になるようにする
48 int S[100009], SZ = 0;
49
50 // 深さ優先探索の初期化
51 for (i = 1; i <= N; i++) {
52 visited[i] = false;
53 }
54 visited[1] = true;
55 S[SZ] = 1; SZ++; // S に 1 を追加
56
57 // 幅優先探索
58 while (SZ >= 1) {
59 int pos = S[SZ - 1]; // S の先頭を調べる
60 SZ--; // S の先頭を取り出す
61 for (i = 0; i < degree[pos]; i++) {
62 int nex = G[pos][i];
63 if (visited[nex] == false) {
64 visited[nex] = true;
65 S[SZ] = nex; SZ++; // S に nex を追加
66 }
67 }
68 }
69
70 // 連結かどうかの判定(Answer=true のとき連結)
71 bool answer = true;
72 for (int i = 1; i <= N; i++) {
73 if (visited[i] == false) {

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected