乗換案内のプログラムをC言語で作ろうと思っています。(1)出発駅を最も遅く出発して,目的駅に到着時刻までに到着する行き方を求めるプログラムは作成することができたのですが、(2)出発駅を最も遅く出発して,目的駅に到着時刻までに到着する行き方を求めるプログラムがどうやって作成したらいいのか分かりません。
自分としてはアークの設定と、出発ノードの設定を変えればいいのかなと考えているのですが、具体的にどのように変えればいいのかが思い浮かびません。どのように修正すればいいのかわかる方がおりましたらご教授いただけたら幸いです。
#include <stdio.h>
#define N 22
int S[N]; // 最短距離を計算済みのノードを格納
int d[N]; // d[i]は、出発ノードからノードiまでの最短距離を格納するための配列
int p[N]; // 最短経路を格納
int c;
struct node // 電車情報の構造体
{
中略
}
int flag; // flagが0なら出発ノード、flagが1なら到着ノード
int T_name; // 電車の名番
char s_name[20]; // 出発駅の名前
char e_name[20]; // 到着駅の名前
int s; // 出発駅の名前に対応した番号
int e; // 到着駅の名前に対応した番号
int s_time; // 出発時刻
int e_time; // 到着時刻
};
void dijkstra(int a[N][N],int s);
int main(void)
{
int S,E,i,j,k,time,hour;
int A[N][N];
S=0;
E=N-1;
for(i=0;i<N;i++)
{
for(k=0;k<N;k++)
{
A[i][k]=9999;
}
}
train[0].s_time=60*hour+time;
for(i=1;i<N-1;i++)
{
for(j=1;j<N-1;j++)
{
// 走行アーク
if(train[i].T_name==train[j].T_name && train[i].flag==0 && train[j].flag==1 && train[i].s_time==train[j].s_time)
{
A[i][j]=train[j].e_time-train[i].s_time;
}
// 停車アーク
if(train[i].T_name==train[j].T_name && train[i].flag==1 && train[j].flag==0 && train[i].e==train[j].s)
{
A[i][j]=train[j].s_time-train[i].e_time;
}
// 乗り換えアーク
if(train[i].T_name!=train[j].T_name && train[i].flag==1 && train[j].flag==0 && train[i].e==train[j].s && train[i].e_time<train[j].s_time)
{
A[i][j]=train[j].s_time-train[i].e_time;
}
}
}
for(i=1;i<N-1;i++)
{
// 出発アーク
if(train[0].s==train[i].s && train[i].flag==0)
{
if(train[0].s_time<=train[i].s_time)
{
A[0][i]=train[i].s_time-train[0].s_time;
}
else
{
A[0][i]=(train[i].s_time+24*60)-train[0].s_time;
}
}
}
for(i=1;i<N-1;i++)
{
// 到着アーク
if(train[N].e==train[i].e && train[i].flag==1)
A[i][N-1]=0;
}
dijkstra(A,S);
i=E;
while(p[i]!=0)
{
if(train[p[i]].flag==0)
{
printf("%s:%d時%d分発",train[p[i]].s_name,train[p[i]].s_time/60,train[p[i]].s_time%60);
}else
{
printf("%s:%d時%d分着",train[p[i]].e_name,train[p[i]].e_time/60,train[p[i]].e_time%60);
}
if(p[i]!=0)
printf("\n\n");
i=p[i];
}
return 0;
}
void dijkstra(int a[N][N],int s)
{
int i,j,k,v,w,min;
for(i=1;i<N;i++)
d[i]=9999;
for(i=0;i<N;i++)
S[i]=0;
d[s]=0;
c=0;
while(1)
{
c=0;
min=9999;
for(k=0;k<N;k++)
{
if(S[k]==0 && d[k]<min)
{
v=k;
min=d[k];
}
}
S[v]=1;
for(i=0;i<N;i++)
{
if(S[i]==0 && a[v][i]!=9999)
{
w=i;
if(d[w]>d[v]+a[v][w])
{
d[w]=d[v]+a[v][w];
p[w]=v;
}
}
}
for(i=0;i<N;i++)
{
if(S[i]==0)
c=c+1;
}
if(c==0)
break;
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) ColabでのPytorchのエラー 1 2022/11/19 20:51
- 英語 What time the next train will come at this station 5 2023/02/11 20:05
- 英語 「彼は次の電車に乗っているかもしれない。」を英語に訳す問題で、 He may be taking a 3 2022/04/17 13:23
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- その他(プログラミング・Web制作) pythonのエラーについて 2 2022/08/17 17:17
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 英語 未来進行形の使い方 5 2023/04/12 08:20
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- 英語 英語についてです。 If we use a train, we can go there faste 1 2022/04/16 22:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
卒業研究でよく分からないとこ...
-
ラップ関数とはどんなものですか?
-
if と配列の組み合わせ
-
C言語初心者です、、、お助けく...
-
【C++】関数ポインタの使い方
-
アスタリスクで正方形
-
インライン展開されているか確...
-
構造体の勉強中です 合計点の高...
-
異なる文字列のマッチングを、D...
-
数字列を3桁ごとにカンマで区切...
-
C言語 配列と関数の練習問題
-
C言語で三目並べをするプログラ...
-
入力を待たずにstdinの監視をし...
-
ファイルから読みこむ方法
-
課題でつまってます・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報