#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 を静的に確保してしまったため、動的に確保したいなら、
元のように修正してください。
次のプログラムは参考になりますか?
[code=c]
#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;
}
[/code]
gra を静的に確保してしまったため、動的に確保したいなら、
元のように修正してください。