GRL_1_A Single Source Shortest Path
問題
単一始点最短経路 | グラフ | Aizu Online Judge
最短経路問題です。以前ALDSの方で解いたことはありましたが、すっかり解法を忘れていたので、再度調べました。
こちらのサイトが分かり易かったです。
ダイクストラ法(最短経路問題)
ダイクストラ法です。
1.確定ノードから到達可能なノードのコストを更新
2.全ノードのうち、未確定でコストが最小のものを確定フラグを立てる。
3.2で確定フラグを立てたノードについて、1と2を繰り返す。
前回やったときはあんまし受け入れられなかったのですが、今回はすんなり受け入れられました。
#include<stdio.h> #include<stdlib.h> #define LARGE 100000 #define INF 1000000 #define MIN(a, b) ((a) < (b) ? (a) : (b)) int **matrix; int V; typedef struct node{ int cost; int flg; }node; void Dijkstra(node N[],int start,int d){ int min_idx=-1; int min=INF+1; int i; if(d==V-1)return; if(d==0){ N[start].cost=0; N[start].flg=1; } for(i=0;i<V;i++){ if(matrix[start][i]!=-1 && N[i].flg==0){ N[i].cost=MIN(N[start].cost+matrix[start][i],N[i].cost); } } for(i=0;i<V;i++){ if(N[i].flg==0){ if(min > N[i].cost){ min=N[i].cost; min_idx=i; } } } N[min_idx].flg=1; Dijkstra(N,min_idx,d+1); return; } int main(){ int E,start; int s,t,d; int i,j; node N[LARGE]; scanf("%d %d %d",&V,&E,&start); /*隣接行列とノードの初期化*/ matrix=malloc(sizeof(int *)*V); for(i=0;i<V;i++){ matrix[i]=malloc(sizeof(int)*V); for(j=0;j<V;j++){ matrix[i][j]=-1; } N[i].cost=INF; N[i].flg=0; } /*隣接行列作成*/ for(i=0;i<E;i++){ scanf("%d %d %d",&s,&t,&d); matrix[s][t]=d; } if(E==0)N[start].cost=0; Dijkstra(N,start,0); for(i=0;i<V;i++){ if(N[i].cost==INF)printf("INF\n"); else printf("%d\n",N[i].cost); } return 0; }
おおきい隣接行列作成のため、二次元配列を動的に確保したのですが、メモリ不足でacceptされませんでした。
というわけで別の方法を考えてみようと思います。