ダイクストラができません・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
へたれ

ダイクストラができません・・・

#1

投稿記事 by へたれ » 8年前

コード:

#include<windows.h>
#pragma warning(disable:4996)


#include<stdio.h>
#include<stdlib.h>
#define off 0
#define on 1
#define MAX 999
#define node 9
int s, end;
int dist[node], mark[node], prev[node];
int p;



typedef struct Graph_Data
{
	int front; //リンクの始点
	int next; //リンクの終点
	int cost; //リンクの重み
}graph;
graph *gra; //グラフデータ用


void get_weight(void)
{
	int start;
	int end;
	return ;
}

void Create_graph() {
	FILE *fp;
	graph *p; //構造体用ポインタを宣言
			  //有効リンク数に対し、動的にメモリ領域を確保する
	gra = (graph *)malloc(sizeof(graph) * 24);
	p = gra; //グラフを指す
	fp = fopen("6078-aa.c", "r"); //ファイルを開く
	if (!fp) puts("Open fail!"); //開いたことを確認
	
	//ファイルポインタが一行ずつ(データ 3 つ)読み込んで、終了時に EOF が返す
	for (int i = 0; i<24 && !feof(fp); i++) { //データを構造体へ読み込む
		fscanf(fp, "%d %d %d", &p->front, &p->next, &p->cost);
		p++; //グラフ内次のリンクへ移動
	}
	fclose(fp);
}

void Dijkstra() {
	Create_graph();
	int i, j, k;
	for (i = 0; i < node; i++) {
                dist [i]  = cost
		mark[i] = off;
		if (dist[i] == MAX)		prev[i] = -1;
			
		 else prev[i] = 0;
	}

	dist[s] = 0;
	mark[s] = on;

	while (mark[end] = !on)
	{
		int min = MAX;

		for (j = 0; j < node; j++) {
			if ((!mark[i] )&& ( dist[j]<min)) {
				min = dist[j];
				k = j;
			}
		}
		mark[k] = on;
		for (j = 0; j< node; j++) {
			if (!mark[j]&& dist[j]  + cost < dist[k]) {
				dist[j] = dist[k] + cost ;
				prev[j] = k;
			}
		}
	} 
}

int main() {
	int j, m, count = 0;
	int way[node];
		printf("\nInput the start point and the end point :");
	scanf("%d %d ", &s, &end);
	Dijkstra();
	printf("The distance from %d is: %d\n", s, end, dist[end]);
	m = end;
	while (m != s) {
		count++;
		way[count] = prev[m];
		m = prev[m];
	}
	printf("\nRhe best path is:\n");
	for (j = count; j >= 1; j--) {
		printf("%d ->", way[j]);
	}
	printf("%d\n", end);

	system("pause");
	return 0;
}

コード:

0	1	2
0	3	3
1	0	2
1	2	3
1	4	4
2	1	3
2	5	2
3	0	3
3	4	2
3	6	1
4	1	4
4	3	2
4	5	4
4	7	3
5	2	2
5	4	4
5	8	3
6	3	1
6	7	6
7	4	3
7	6	6
7	8	1
8	5	3
8	7	1
ダイクストラ法を使ったプログラムなんですけどcostのところに重みを入れたいんですが
サブ関数で get_weight(int start, int end) などを使えと言われてもわかりません
どなたか教えてくださいませんか?

かずま

Re: ダイクストラができません・・・

#2

投稿記事 by かずま » 8年前

次のプログラムは参考になりますか?

コード:

#include <stdio.h>
#include <stdlib.h>

#define OFF    0
#define ON     1
#define MAX  999
#define NODE   9
#define SIZE  24

int start, end;
int dist[NODE], mark[NODE], prev[NODE];
 
typedef struct Graph_Data {
    int front; //リンクの始点
    int next;  //リンクの終点
    int cost;  //リンクの重み
} graph;

graph gra[SIZE]; //グラフデータ用
int size;
 
int get_weight(int j, int k)
{
    graph *p = gra;
    for (int i = 0; i < size; i++, p++)
        if (p->front == j && p->next == k)
            return p->cost;
    return MAX;
}
 
void Create_graph(void)
{
    graph *p = gra;
    FILE *fp = fopen("6078-aa.c", "r");
    if (!fp) puts("Open fail!"), exit(1);
    for (size = 0; size < SIZE; size++, p++)
        if (fscanf(fp, "%d%d%d", &p->front, &p->next, &p->cost) != 3)
            break;
    fclose(fp);
}

void Dijkstra(void)
{
    Create_graph();
    for (int i = 0; i < NODE; i++) {
        mark[i] = OFF;
        dist[i] = MAX;
        prev[i] = -1;
    }
    dist[start] = 0;
    for (int i = 0; i < NODE; i++) {
        int k, min = MAX;
        for (int j = 0; j < NODE; j++) {
            if (mark[j] == OFF && dist[j] < min) {
                min = dist[j];
                k = j;
            }
        }
        mark[k] = ON;
        for (int j = 0; j < NODE; j++) {
            if (mark[j] == OFF) {
                int cost = get_weight(j, k);
                if (dist[k] + cost < dist[j]) {
                    dist[j] = dist[k] + cost;
                    prev[j] = k;
                }
            }
        }
    } 
}
 
int main(void)
{
    printf("\nInput the start point and the end point: ");
    if (scanf("%d%d", &start, &end) != 2) return 1;

    Dijkstra();

    printf("The distance from %d to %d is: %d\n", start, end, dist[end]);
    int way[NODE], count = 0;
    for (int m = end; m != start; m = prev[m])
        way[count++] = prev[m];
    printf("The best path is: ");
    for (int j = count; --j >= 0; )
        printf("%d ->", way[j]);
    printf("%d\n\n", end);
 
    system("pause");
    return 0;
}
gra を静的に確保してしまったため、動的に確保したいなら、
元のように修正してください。

返信

“C言語何でも質問掲示板” へ戻る