최단거리 구하는 거 도와주세요!!! 꼭좀 봐주세요!
로지
질문 제목 : 최단거리 구하는 소스질문 요약 :놀이기구사이의 최단거리와 길이 막혔을 경우 다시 돌아가는 거리 구하는 법
소스 두가지를 어떻게 합쳐야 하는지질문 내용 : 최단거리를 구해야 하는데 이게 각각 놀이기구 사이의 최단거리와 그 놀이기구들 사이에서 퍼레이드 같은걸로 길이 막혔을 때 다른길로 가는 최단거리를 구해야 하는데 소스 두개를 어떻게 합쳐야 하나요?
#includestdio.h
#define n 32//vertex의 갯수
#define m 10000//최장거리 보다 큰값
void main()
{
int data[n][n] = {//건물들간의 그래프 관계
// 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
{0,m,m,m,m,m,3,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,m,m,1,m,m,m,m},
{m,0,3,m,m,m,1,m,m,m,1,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,3,0,m,m,m,3,m,m,m,m,m,m,m,2,m,m,1,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,0,2,2,m,m,m,m,m,m,1,m,m,m,m,m,m,m,3,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,2,0,m,m,m,m,m,m,2,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,m,2,0,m,m,m,m,1,3,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,1,m,3,m,m,0,m,m,m,m,m,m,2,m,m,3,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,m,m,m,m,0,m,m,m,m,m,m,2,m,m,m,m,m,m,m,1,m,m,2,m,m,m,m,m,m},
{2,m,m,m,m,m,m,m,0,m,m,m,m,m,m,1,1,m,m,m,m,m,m,m,m,m,m,m,m,2,m,m},
{2,m,m,m,m,m,m,m,m,0,m,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,1,m,m,m,m},
{m,1,m,m,m,1,m,m,m,m,0,3,m,m,4,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m},
{m,m,m,m,1,2,m,m,m,m,3,0,m,m,2,m,m,m,m,m,m,m,m,m,m,1,m,m,m,m,m,m},
{m,m,m,1,m,1,m,m,m,m,m,m,0,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,m},
{m,m,m,m,m,m,1,m,m,m,m,m,m,0,m,m,m,m,m,m,m,m,m,m,m,m,1,m,m,m,m,m},
{m,m,2,m,m,m,m,2,m,m,m,2,m,m,0,m,m,2,m,m,m,m,m,m,m,2,m,m,m,m,m,m},
{2,m,m,m,m,m,m,m,m,1,m,m,m,m,m,0,1,m,m,m,m,m,m,m,m,m,1,m,m,m,m,m},
{m,m,m,m,m,m,m,m,1,m,m,m,m,m,m,1,0,m,m,m,m,m,m,m,m,m,1,m,m,m,m,m},
{m,m,1,m,m,m,m,m,m,1,m,m,m,m,1,m,m,0,m,2,m,2,m,m,m,m,m,1,m,m,m,m},
{m,m,m,m,1,m,m,m,m,m,m,m,m,m,m,m,m,m,0,m,m,m,m,1,m,m,m,m,m,m,m,m},
{m,m,m,m,m,m,m,m,m,1,m,m,m,m,m,m,m,2,m,0,m,1,m,m,m,m,m,m,m,m,m,m},
{m,m,m,1,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,0,m,m,m,2,m,m,m,m,m,m,m},
{m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,3,m,2,m,0,m,m,m,m,m,m,m,m,m,1},
{m,m,m,m,m,m,m,1,m,m,m,m,m,m,m,m,m,m,m,m,m,m,0,1,m,2,m,m,m,m,m,m},
{m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,1,m,m,m,1,0,m,m,m,m,m,m,m,m},
{m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,2,m,m,m,0,m,m,m,m,m,m,m},
{m,m,m,m,m,m,m,2,m,m,m,1,m,m,1,m,m,m,m,m,m,m,2,m,m,0,m,m,m,m,m,m},
{m,m,m,m,m,m,2,m,m,m,m,m,m,1,m,1,1,m,m,m,m,m,m,m,m,m,0,m,m,m,m,m},
{1,m,2,m,m,m,m,m,m,1,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,0,m,m,m,m},
{m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,0,m,m,m},
{m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,0,m,m},
{m,m,m,m,m,m,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,0,m},
{m,m,m,m,m,m,m,1,m,m,m,m,m,m,2,m,m,m,m,m,m,2,m,m,m,m,m,m,m,m,m,0}
};
int s, e;
int k, min;
int ver[n], dis[n], via[n];//가는 경로와 거리를 저장하는 배열
printf(input start position: );
scanf(%d, &s);
printf(input end position: );
scanf(%d, &e);
for(int j=0; jn; j++)//배열 초기화
{
ver[j] = 0;
dis[j] = m;
}
dis[s-1] = 0;//자신의 위치 거리 0
for(int i=0; in; i++){//최단경로 찾는 for문
min = m;
for(j=0; jn; j++){//이어진 건물 탐색
if(ver[j]==0 && dis[j]min){
k = j;
min = dis[j];
}
}
ver[k] = 1;//한번 찾은 길 표시
if(min==m) break;//막다른길 이면 break;
for(j=0; jn; j++){//찾아놓은 길보다 가까운 길이 있는지 확인
if(dis[j] dis[k] + data[k][j]){
dis[j] = dis[k] + data[k][j];
via[j]=k;//경로 저장
}
}
}
printf(\n%d에서 %d로 가는 최단 거리 : %d\n, s, e, dis[e-1]);
int path[n], path2=0;
k=e-1;
while(1)//경로 출력
{
path[path2++]=k;
if(k==s-1) break;
k=via[k];
}
printf(path: );
for(i=path2-1;i=1;i--){//뒤에 부터 탐색하면서 경로 출력
printf(%d - ,path[i]+1);
}
printf(%d\n,path[i]+1);
}
일단 이게 길이 막혔을 때 다른길 찾는 거구여
#include stdio.h
#include string.h
#define MAX 999//정점이 직접적으로 연결되지 않았을때 들어가는 값
//Y[]: V가 Y에 속하면 1 속하지 않으면 0, touch[]: V의 index
//length[]:V(start)에서 V(i)로의 최단 경로의 길이
const char name[38][60]={//1번부터 38번까지 정점들의 이름
{신밧드의 모험}, {스페인해적선}, {후룸라이드}, {회전목마},{환상의 오딧세이},{자이안트 루프},{회전바구니},{황야의 무법자},
{볼배틀},{4D 입체영화관},{어린이 범퍼카},{스윙팡팡},{매직붕붕카},{크레이지 범퍼},{트러블 호퍼},{로티 트레인},
{아트란티스},{자이로스윙},{범퍼카},{고스트 하우스},{자동차 경주},{자이로드롭},{환타지 드림},{제네바 유람선},
{후렌치 레볼루션},{정글탐험보트},{월드모노레일},{파라오의 분노},{풍선비행},{다이나믹 시어터},
{동물극장},{회전 그네},{어린이 왕국},{번지드롭},{고공파도 타기},{혜성 특급},{캐슬 뮤직쇼},{호반 보트}
};
void Dijkstra(int n, int W[][38], int *touch, int *length) {
int Y[38], i, Vnear,, Vnear, start, step, min;
printf(\n끝점을 입력해주세요\n);//원래는 시작점을 입력받는 것인데 출력과정에서보면
scanf(%d,&start);//시작점이 제일 끝에서부터 나오기 때문에 편의상 끝점이라고 표기함
for(i=1; i=n; i++) {
Y[i] = 0;//Y[]를 0으로 초기화
length[i]=MAX;//length[]를 MAX로 초기화
}
Y[start]=1;//시작점은 무조건 포함되기 때문에 1로 바꿈
length[start]=0;//시작점의 길이를 0으로 바꿈
for(i=0; i=n; i++) {
if(i==start) touch[i]=0;
else touch[i]=start;
length[i]=W[start][i];
}
for(step=1; step=n; step++) {//Y값이 0이면서 length값이 최소인 i를 Vnear로 한다.
min = MAX;
for(i=0; i=n; i++)
{
if(Y[i]==0 && length[i]min)
{
Vnear = i;
min = length[i];
}
}
Y[Vnear]=1;
for(i=0;i=n;i++) {//시작점부터 각 정점들의 최단거리를 구한다.
if(length[Vnear]+W[Vnear][i]length[i]) {
length[i]=length[Vnear]+W[Vnear][i];
touch[i]=Vnear;
}
}
}
printf(\n시작점을 입력하세요\n);
scanf(%d,&i);
printf(시작점 : %s ,name[i-1]);
Vnear = i;
while(touch[Vnear] != 0) {//시작점부터 끝점까지 지나는 모든 정점들을 출력
if(strcmp(name[i-1],name[touch[Vnear]-1])) {//name[i-1]와name[touch[Vnear]-1]의 내용을 비교하여
//내용이 같을 경우 출력을 하지 않는다.
printf(-- %s ,name[touch[Vnear]-1]);
}
Vnear=touch[Vnear];
}
printf( 까지의);
printf(\n최단거리는 %d 입니다.\n,length[i]);
}
이건 임의로 이름만 바꺼서 한건데 돌아가진 않는 것 같아요..
이거 두개를 합쳐야 하는데.. 어떻게 합쳐야 하죠??
도와주세요 !!!
-
천칭자리
이건 다익스트라와 그래프, 함수 모듈화에 대한 이해가 없으면 이해시켜드리기가 좀 어렵겠는데요...
질문자분의 수준이 어느정도인지 알 필요가 있습니다.
함수는 제대로 짤 수 있는지, 자료구조는 해보았는지, 그래프가 뭔지는 아는지 등 말이죠.