• 締切済み

c言語でのダイクストラ法の実装

Ultra-Hetareの回答

回答No.1

入力例とその解説自体が捉え処がないです。 はっきり言って意味が分かりません。 あくまで参考ですが下記をご一読願います。 http://www5e.biglobe.ne.jp/~aji/3min/ex/sup03.html (通常環境ではフラッシュが再生できませんがchromeのアドオンで  再生可能ですというかダイクストラのアルゴリズム自体は  文章で十分表現されています) よろしくおねがいします。

関連するQ&A

  • C言語 格子点が多角形の中にあるかどうか?

    こんにちは. 私はプログラミングを勉強しはじめて3ヵ月くらいです. 今、与えられた多角形(例えば、(0,0),(3,7),(5,7),(8,3),(4,1),(1,0)の五点からなる多角形)の内部に格子点が存在するかどうかをチェックする(存在すれば1を返す等)ということをプログラミングを利用して,解決したいと思っています.最終的にはそれを利用して与えられた多角形をビットマップ表示にすることが目的です. 現在ある一つの自分の決めた点に関しては与えられた多角形を打ち込むことによって中か外かを判定する関数はできているのですが、100×100個の計10000個分の格子点に関してすべて中にあるか外にあるかを判定したいのですが、なかなか上手くいきません. 分かる方いらっしゃいましたら、アドバイスやプログラムの方よろしくお願いします. 今できているプログラムをのせておきます. #include <stdio.h> #include <stdlib.h> /* #define JUST_ON 2 */ #define JUST_ON 1 int insidePolygon(int x, int y, int pn, int *px, int *py); int insidePolygon(int x, int y, int pn, int *px, int *py) /* x and y are the vertex I want to know in polygon. pn is the number of vertex of polygon *px and *py are the vertex of polygon */ { int i, j; int inside; double yy; if (pn < 1) return 0; if (pn == 1) return x==px[0] && y==py[0]; /* Point (x,y) just lies on the edge or vertex of polygon */ for (i = 0, j = pn-1; i < pn; j = i++) { if (py[i] == py[j] && y == py[i] && ((px[i]<=x && x<=px[j]) || (px[j]<=x && x<=px[i]))) return JUST_ON; else if (py[i] != py[j] && ((py[i]<=y && y<=py[j]) || (py[j]<=y && y<=py[i])) && x == (double)(px[j]-px[i])*(y-py[i])/(py[j]-py[i])+px[i]) return JUST_ON; } /* Point (x,y) is inside/outside polygon */ inside = 0; yy = y + 0.5; /* shift y to avoid acrossing the poly's edges or vertices */ for (i = 0, j = pn-1; i < pn; j = i++) { if (((py[i]<=y && y<py[j]) || (py[j]<=y && y<py[i])) && x < (double)(px[j]-px[i])*(yy-py[i])/(py[j]-py[i])+px[i]) inside = !inside; } return inside; } int main() { int ii; int xx, yy; int pnpn; int pxpx[100], pypy[100]; int ret; printf("Enter (x,y) of a point -> "); scanf("%d %d", &xx, &yy); printf("Enter the number of vertics of the polygons -> "); scanf("%d", &pnpn); for (ii= 0; ii < pnpn; ii++) { printf("Enter %d-th vertics's (x, y) -> ", ii+1); scanf("%d %d", &pxpx[ii], &pypy[ii]); } ret = insidePolygon(xx, yy, pnpn, pxpx, pypy); if (ret == 0) printf("The point is outside the polygon.\n"); else printf("The point is inside the polygon\n"); }

  • C言語がゎからなくて困ってます;;

    <プログラム(1)> #include <stdio.h> int main() { int i; char a[]="Simulation", *po; po=a; while(*po!='\0') { po++; i++; } printf("The Number of \"Simulation\" is %d\n", i); } <実行結果> The Number of "Simulation" is 10 <プログラム(2)> #include <stdio.h> int main() { int i,j = 0; char a[]="Faculty of Industrial Science and Technology", *po; po=a; while(*po!='\0') { if(*po <= 'z' && *po >= 'a') i++; if(*po <= 'Z' && *po >= 'A') j++; po++; } printf("\"Faculty of Industrial Science and Technology\" contains %d small letters.\n", i); printf("\"Faculty of Industrial Science and Technology\" contains %d capital letters.\n", j); } <実行結果> "Faculty of Industrial Science and Technology" contains 35 small letters. "Faculty of Industrial Science and Technology" contains 4 capital letters. 学校の宿題でプログラムを作ったんですけど、 プログラム(1)ではi=0と書ぃてぃないのにきちんと文字数のカウントが できるのに、プログラム(2)ではi,j=0と書かなければうまくいきませんでした。でもその理由がわからなくて困ってます↓↓ 誰か教えてくださぃ!! 教えてください。

  • C言語 最も小さい数

    #include <stdio.h> #define NUMBER 5 int min_of(const int vc[ ], int no){ int i; int min=vc[0]; for(i=1;i<no;i++) if(vc[i]<min){ min=vc[i]; return(min); } } int main(void) {int a[NUMBER],i=0; for(;i<NUMBER;i++){ scanf("%d",&a[i]); } printf("%d",min_of(a,NUMBER)); return(0); } 最も小さい数を出すようにしたいのですがうまくいきません。 どこがおかしいのでしょうか? 教えてくださいm(_ _ )m

  • C言語でのプログラム

    全対最短経路(フロイドのアルゴリズム)のプログラムを作成したんですが、以下のようなメッセージが出てしまい、どこが悪いのかさっぱりわかりません。どなたかご教授願えないでしょうか? <プログラム> #include<stdio.h> #define NC 999 /* It should be large enough. */ #define N 5 void floyd(int, int [][], int [][], int [][]); int W[N][N] = { { 0, 1, NC, 1, 5 }, { 9, 0, 3, 2, NC }, { NC, NC, 0, 4, NC }, { NC, NC, 2, 0, 3 }, { 3, NC, NC, NC, 0 }, }; int P[N][N]; int D[N][N]; main() { floyd(N, W, D, P); } void floyd(int n, int W[][], int D[][], int P[][]) { int i, j, k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ P[i][j] = 0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ D[i][j] = W[i][j]; } } for(k=0;k<n;k++){ for(i=0;i<n;j++){ for(j=0;j<n;j++){ if(D[i][k]+D[k][j]<D[i][j]){ P[i][j] = k; D[i][j] = D[i][k] + D[k][j]; } } } } printf("?nall pairs of the shortest pathes:?n"); for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%3d ", D[i][j]); } printf("?n"); } printf("?n"); } <エラーメッセージ> In function `floyd': :30: error: invalid use of array with unspecified bounds :36: error: invalid use of array with unspecified bounds :43: error: invalid use of array with unspecified bounds :44: error: invalid use of array with unspecified bounds :45: error: invalid use of array with unspecified bounds :54: error: invalid use of array with unspecified bounds

  • C言語 初心者です。

    以下のソースの中でわからないことがあります。 詳しく説明してもらえないでしょうか? よろしくお願いします。 #include <stdio.h> #define NUMBER 80 /* 人数の上限 */ int main(void) { int i,j; int num; int tensu[NUMBER]; int bunpu[11] = {0}; printf("人数を入力してください。:"); do{ scanf("%d",&num); if (num < 0 || num > NUMBER) printf("\a要【1以上%d以下】:", NUMBER); }while (num > 0 || num < NUMBER); puts("点数を入力してください。"); for (i = 0; i < num; i++){ printf("%2d番:", i + 1); do { scanf("%d",&tensu[i]); if (tensu[i] < 0 || tensu[i] > 100) printf("\a要 【0以上100以下】:"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } 上記のソースの中の bunpu[tensu[i] / 10]++; の部分がどうなっているのかわかりません。 教えてください。

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語 探索に関して

    C言語探索プログラムについて質問です。 #include <stdio.h> #define MAXSIZE 100 void swapData(int *x, int *y){ int tmp; tmp = *x; *x = *y; *y = tmp; } void simpleSort(int data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(data[i] > data[j]) { swapData(&data[i], &data[j]); } } } } int ArrayBinarySearch(int data[], int n, int x) { int left = 0, right = n - 1, center; while(left <= right){ center = (left + right)/2; if(data[center]=x){ return center; }else if(x > data[center]){ left = center + 1; }else if(x < data[center]){ right = center - 1; } } return -1; } int main(int argc, char *argv[]) { int data[MAXSIZE]; int i, x; FILE *fp; scanf("%d", &x); fp = fopen(argv[1], "r"); for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%d", &data[i]) == EOF) break; } simpleSort(data, 0, i-1); printf("%d", ArrayBinarySearch(data, i, x )); return 0; } 数値が書かれたファイルを読み込んでソートした後に二分探索を行うプログラムをつくったのですが、うまく動きません。 どこがおかしいか教えてください。 お願いいたします。 ちなみに関数ArrayBinarySearchは目的の値が見つかれば配列中でのインデックスを、見つからない場合は-1を返す関数にしているつもりです。

  • C言語 構造体とvectorについてです

    C言語についてこんなプログラムをつくろうとしています。内容はこんなです↓↓ 1「番号・身長・体重を入力」←番号を入力するとこで0と入力するまでループ 2「今まで入力した値の平均を出力」←身長・体重それぞれの値の平均 3「番号を入力すると対応したデータ(1で打ち込んだデータ)を出力」 4「1を入力すると出力した値の修正をする」 3と4のループをして3のところで0を入力したら終了。。。 という感じです。 わからないとこは、最初のnumberの入力でデバックエラーがおきてしまうとこ(scanf("%d",&vec[i].number);の部分がおかしい?)、2は全体的にわかりません、3と4はなんとなくわかります。 構造体とvectorを使うのがわかりやすいと思って作成中ですが完全に止まってしまいました。 できれば1と2のプログラムを作成していただけませんか?よろしくおねがいします。 int main() { float height, weight; int i, b, D, P, J, M, E, number; vector<student_list> vec; student_list num; vec.push_back(num); for(i = 0;;i++) { printf("%d人目のデータです\n番号を入力して下さい\n", i + 1); scanf("%d",&vec[i].number); if(vec[i].number == 0) { return 0; } else { printf("身長と体重を入力して下さい\n"); scanf("%f\n%f",&vec[i].height,&vec[i].weight); printf("あなたのBMIは%.1fです\n",vec[i].weight*vec[i].weight/vec[i].height); printf("電子回路の点数を入力して下さい\n"); scanf("%d",&vec[i].D); printf("プログラミングの点数を入力して下さい\n"); scanf("%d",&vec[i].P); printf("国語の点数を入力して下さい\n"); scanf("%d",&vec[i].J); printf("数学の点数を入力して下さい\n"); scanf("%d",&vec[i].M); printf("英語の点数を入力して下さい\n"); scanf("%d",&vec[i].E); printf("国数英の平均点は%dです\n",(vec[i].J+vec[i].M+vec[i].E)/3); printf("5教科の平均点は%dです\n",(vec[i].D+vec[i].P+vec[i].J+vec[i].M+vec[i].E)/5); } } }

  • C言語プログラミングで・・・

    つい最近、C言語プログラミングのお勉強をはじめた中学生です。 ある程度かけるようになってきて、こちらのサイトに掲載されている練習問題を解いていました。 http://akabas.net/lib/CExercise.aspx いろいろといていく中で、配列の章にはいりました。 配列の章の中の6問目と7問目の九九についてのコードを書いていたところ、どちらも問題なく実行を終了した後 「○○.exeは動作を停止しました。」というメッセージが現れました。 これはコードに何か問題があるのでしょうか? _____________________________________________________________________ //6問目 #include <stdio.h> void line (void){ int cnt; for (cnt = 0; cnt < 30; cnt++) printf("_"); printf("\n"); } int main() { int kuku[9][9], i, j; printf("九九を表示します\n"); for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++){ kuku[i][j] = i * j; printf("%d * %d = %d\n", i, j, kuku[i][j]); } line(); } return 0; } ____________________________________________________________________ //7問目 #include <stdio.h> int main() { int kuku[9][9]; int i, j; for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++) kuku[i][j] = i * j; } printf("1桁の数値(1 ~ 9に限定)を入力してください 1回目---"); scanf("%d", &i); printf("1桁の数値(1 ~ 9に限定)を入力してください 2回目---"); scanf("%d", &j); printf("\n"); printf("%d * %d = %d", i, j, kuku[i][j]); return 0; } ________________________________________________________________________________ まだ初心者のレベルなので、回答はできたらきつい言葉をつかってほしくないです^^; よろしくおねがいします ※こちらでは、Tabをうっているのですが、表示されてないみたいです。見づらいかと思いますが、よろしくおねがいします

  • C言語について

    #include <stdlib.h > #include <stdio.h> double sum ( double data[] , int number) { double result; int a ; result = 0; for (a = 0; a < number; a+1){ result += data[a]; } return (result); } double average ( double data[] , int number) { double result; result = sum(data,number)/number; return (result); } int main ( void ) { double heikin; double data[9]; double average; int number,i; printf("数値の数を入力(1~10) = "); scanf("%d",&number); printf("データを入力 "); for( i=0;i<number;i++ ) { printf("%d個目 = ",i+1); scanf("%d",&data[i]); } heikin = average(data,number); printf("平均は%lfです\n",heikin);//文を使って平均値(heikin)を出力 return(EXIT_SUCCESS); } というプログラムがありエラーで 「35行目」で記述エラーを発見しました。 「function pointer」を付け忘れています。 と出てきます。ほかのサイト様で写真とかありえないといわれましたのでテキストで再度質問させていただきました。 よろしくお願いします。 前投稿から編集もしているので少しプログラムが違います。