フロイドのアルゴリズム
Posted: 2010年5月20日(木) 23:17
私は千葉の大学生です。
フロイドのアルゴリズムを勉強しています!
先生のヒントがあまりなく困ってます><
課題で最短経路(cost)と来た道すじ(via)を表示したいのですが、どのようにしたら良いでしょうか?
/**/の部分を色々考えていたのですが…よろしくお願いします。
#include<stdio.h>
#define NC 10000
#define N 6
int a[N][N] = {
/* 0 */ { 0, NC, 4, 2, 8, NC},
/* 1 */ { 5, 0, 1, NC, 8, NC},
/* 2 */ { NC, 4, 0, NC, NC, 6},
/* 3 */ { NC, NC, NC, 0, 5, NC},
/* 4 */ { NC, 2, 1, NC, 0, 46},
/* 5 */ { NC, NC, 4, NC, NC, 0}
}; //グラフ
int i,j,k,x;
int cost[N][N]; //経路のコスト
int via[N][N]; //どこから来たのか?
for(i=0;i<N;i++){ //直行ならここへ
for(j=0;j<N;j++){
cost[j]=a[j];
via[j]=i;
}
}
for(k=0;k<N;k++){ //kを経由するならここへ
for(i=0;i<N;i++){
for(j=0;j<N;j++){
x=cost[k]+cost[k][j];
if(x<cost[j]){ //コストと来た場所を更新
cost[j]=x;
via[j]=k;
}
}
}
}
/*
for(i=0;i<N;i++){
for(j=0;j<N;j++){
opp(i,j);
}
}
void opp(int p, int q){
if(via[p][q]=p){
p=p; q=q;
printf("%d %d\n",p,via[p][q]);
printf("%d %d\n",via[p][q],q);
}
if(via[p][q]!=p){
printf("%d %d\n",p,via[p][q]);
printf("%d %d\n",via[p][q],q);
}
}*/
int main(){
opp(0,5); //スタートの表示
return 0;
}

フロイドのアルゴリズムを勉強しています!
先生のヒントがあまりなく困ってます><
課題で最短経路(cost)と来た道すじ(via)を表示したいのですが、どのようにしたら良いでしょうか?
/**/の部分を色々考えていたのですが…よろしくお願いします。
#include<stdio.h>
#define NC 10000
#define N 6
int a[N][N] = {
/* 0 */ { 0, NC, 4, 2, 8, NC},
/* 1 */ { 5, 0, 1, NC, 8, NC},
/* 2 */ { NC, 4, 0, NC, NC, 6},
/* 3 */ { NC, NC, NC, 0, 5, NC},
/* 4 */ { NC, 2, 1, NC, 0, 46},
/* 5 */ { NC, NC, 4, NC, NC, 0}
}; //グラフ
int i,j,k,x;
int cost[N][N]; //経路のコスト
int via[N][N]; //どこから来たのか?
for(i=0;i<N;i++){ //直行ならここへ
for(j=0;j<N;j++){
cost[j]=a[j];
via[j]=i;
}
}
for(k=0;k<N;k++){ //kを経由するならここへ
for(i=0;i<N;i++){
for(j=0;j<N;j++){
x=cost[k]+cost[k][j];
if(x<cost[j]){ //コストと来た場所を更新
cost[j]=x;
via[j]=k;
}
}
}
}
/*
for(i=0;i<N;i++){
for(j=0;j<N;j++){
opp(i,j);
}
}
void opp(int p, int q){
if(via[p][q]=p){
p=p; q=q;
printf("%d %d\n",p,via[p][q]);
printf("%d %d\n",via[p][q],q);
}
if(via[p][q]!=p){
printf("%d %d\n",p,via[p][q]);
printf("%d %d\n",via[p][q],q);
}
}*/
int main(){
opp(0,5); //スタートの表示
return 0;
}
