アプリ版:「スタンプのみでお礼する」機能のリリースについて

乗換案内のプログラムを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;
}
}

A 回答 (1件)

ん?



「出発駅を最も遅く出発して,目的駅に到着時刻までに到着する行き方を求めるプログラム」が作れるんだったら
「出発駅を最も遅く出発して,目的駅に到着時刻までに到着する行き方を求めるプログラム」も作れますよねぇ....

同じものなんだし.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!