質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

解決済

2回答

1451閲覧

最適化による結果の違いの原因を知りたい。

vm.ga

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

0グッド

1クリップ

投稿2020/05/28 08:13

編集2020/05/28 08:14

前提・実現したいこと

プログラミング学習としてこちらの問題を解こうとしています。
https://onlinejudge.u-aizu.ac.jp/challenges/sources/PCK/Prelim/0391?year=2018

発生している問題・エラーメッセージ

自分の環境でコードを実行すると正解が出るのですが、サイト上の判定ではWA(wrong answer)が出ます。
最適化の有無が原因だと考えられるのですが、どのような状況下で最適化による影響が出るのか教えていただけると幸いです。

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#define N_MAX 100010 4 5int parent[100005]; 6 7int depth[100005]; 8int dist[100005]; 9 10int p[30][100005]; 11 12typedef struct lst 13{ 14 struct lst *next; 15 int to; 16 int cost; 17} LIST; 18 19LIST list[N_MAX]; 20 21LIST *newnode(void) 22{ 23 LIST *p; 24 p = malloc(sizeof(LIST)); 25 if (p != NULL) 26 { 27 p->next = NULL; 28 } 29} 30 31LIST *add(LIST *p, int to, int cost) 32{ 33 while (p->next != NULL) 34 { 35 p = p->next; 36 } 37 if ((p->next = newnode()) != NULL) 38 { 39 p->to = to; 40 p->cost = cost; 41 } 42 return p; 43} 44 45int max(int a, int b) 46{ 47 return a > b ? a : b; 48} 49 50int min(int a, int b) 51{ 52 return b > a ? a : b; 53} 54 55void swap(int *a, int *b) 56{ 57 int temp; 58 temp = *a; 59 *a = *b; 60 *b = temp; 61} 62 63 64void dfs(int pos, int prev, int Depth, int Dist) 65{ 66 parent[pos] = prev; 67 depth[pos] = Depth; 68 dist[pos] = Dist; 69 LIST *p; 70 71 for(p = &list[pos];p->next != NULL;p=p->next){ 72 LIST e; 73 e.to = p->to; 74 e.cost = p->cost; 75 if(e.to == prev) 76 continue; 77 dfs(e.to, pos, Depth + 1, Dist + e.cost); 78 } 79 return; 80} 81 82int lca(int a, int b) 83{ 84 if (depth[a] > depth[b]) 85 swap(&a, &b); 86 87 int s = (depth[b] - depth[a]); 88 for (int i = 0; i < 30; i++) 89 if (s >> i & 1) 90 b = p[i][b]; 91 92 if (a == b) 93 return a; 94 95 for (int i = 29; i >= 0; i--) 96 { 97 if (p[i][a] != p[i][b]) 98 { 99 a = p[i][a]; 100 b = p[i][b]; 101 } 102 } 103 return parent[a]; 104} 105 106int calc_dist(int a, int b) 107{ 108 int c = lca(a, b); 109 return dist[a] - dist[c] + dist[b] - dist[c]; 110} 111 112int check(int p, int a, int b, int c) 113{ 114 int res = 0; 115 res = max(res, calc_dist(p, a)); 116 res = max(res, calc_dist(p, b)); 117 res = max(res, calc_dist(p, c)); 118 return res; 119} 120 121int solve(int a, int b, int c) 122{ 123 int x = lca(b, c); 124 if (calc_dist(x, b) > calc_dist(x, c)) 125 swap(&b, &c); 126 127 int y = calc_dist(b, c) / 2; 128 int z = c; 129 for (int i = 29; i >= 0; i--) 130 { 131 int nz = p[i][z]; 132 if (nz != -1 && (dist[c] - dist[nz]) <= y) 133 { 134 z = nz; 135 } 136 } 137 138 int res = check(z, a, b, c); 139 if (parent[z] != -1) 140 res = min(res, check(parent[z], a, b, c)); 141 return res; 142} 143 144int main(void) 145{ 146 int N, Q; 147 int u, v, w; 148 int a, b, c; 149 150 scanf("%d %d", &N, &Q); 151 for (int i = 1; i < N; i++) 152 { 153 scanf("%d %d %d", &u, &v, &w); 154 u--; 155 v--; 156 add(&list[u], v, w); 157 add(&list[v], u, w); 158 } 159 160 dfs(1, -1, 0, 0); 161 162 for (int i = 0; i < N; i++) 163 p[0][i] = parent[i]; 164 165 for (int i = 1; i < 30; i++) 166 { 167 for (int j = 0; j < N; j++) 168 { 169 int x = p[i - 1][j]; 170 if (x != -1) 171 x = p[i - 1][x]; 172 p[i][j] = x; 173 } 174 } 175 176 for (int i = 0; i < Q; i++) 177 { 178 scanf("%d %d %d", &a, &b, &c); 179 a--; 180 b--; 181 c--; 182 int ans = (1 << 30); 183 ans = min(ans, solve(a, b, c)); 184 ans = min(ans, solve(b, a, c)); 185 ans = min(ans, solve(c, b, a)); 186 printf("%d\n", ans); 187 } 188 189 return 0; 190}

試したこと

自分の環境で最適化を施して実行したところ、実行結果が変わりました。(オンラインジャッジと同様になった。)
正解の数値が得られるのですが、オンラインジャッジ上ではすべての数値が0として出力されています。

補足情報(FW/ツールのバージョンなど)

実効環境 gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

LIST *newnode(void)が返り値を返していないようです。

「最適化で動かなくなる」コードは、ほとんどの場合未定義な動作の領域に突入しているコードを書いて発生します。ここでも、void以外の返り値型を持つ関数が値を返さないので、動作は未定義です。

投稿2020/05/28 08:16

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vm.ga

2020/05/28 08:51

返り値を設定したら正常に動作するようになりました。ご指摘いただきありがとうございます。
guest

0

コードは見てませんが、

どのような状況下で最適化による影響が出るのか

影響が出るのは、
・処理系定義の動作
・未定義の動作
・未規定の動作
に依存するコードになっている場合、つまり規格に準拠した正しいCのプログラムでない場合です。

投稿2020/05/28 08:21

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vm.ga

2020/05/28 08:51

maisumakunさんにご指摘いただいたように未定義の動作に依存するコードを作成してしまっていました。 ご指摘ありがとうございます。今後の参考にいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問