최 단 경로 (방향 도 있 음)
2513 단어 코드
순서대로 출력 합 니 다. 해당 경 로 를 저 장 했 을 뿐 순서대로 저장 하지 않 았 습 니 다. 이번 프로그램 은 다른 사람의 코드 로 경로 의 저장 방법 을 흡수 하 였 습 니 다.
갑자기 이 방법 이 이 루어 진 것 같 아 요. Dijsktra 는 제 가 저번 에 쓴 것 보다 훨씬 간결 해 요!!그래서 과감하게 배 웠 습 니 다. 약 한 채소 의 성장 은 신의 도움 과 떨 어 질 수 없습니다. 여기 있 습 니 다.
대 신 룸메이트 감사합니다!!!코드 를 붙 여 주세요. 저장 하 세 요.
P: 코드 와 알고리즘 은 모두 룸메이트 의 것 입 니 다. 공 부 했 습 니 다...:
/*
0 ,weight[u,v] u v , dis[]
: dis[0] 0, , (OK[] = 0)。
n-1 :
1 tmp, (OK[] = 1)。
2 tmp k, Relax(tmp,k), , dis[tmp]+weight[tmp,k]
#include
#include
const int IFINITY = 99999999;
const int N = 50;
int main()
{
int map[N][N], final[N], D[N], parent[N];
//
memset(final, 0, sizeof(final));
memset(parent, -1, sizeof(parent));
for(int i = 0; i < N; i++)
{
D[i] = IFINITY;
for(int j = 0; j < N; j++)
map[i][j] = IFINITY;
}
D[0] = 0;
int n, m, s, e, w;
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++)
{
scanf("%d %d %d", &s, &e, &w);
map[s][e] = w;
}
//Dijsktra
for(int i = 1; i <= n-1; i++)
{
int tmp = -1;
for(int j = 0; j < n; j++)
if(final[j] == 0 && (tmp == -1 || D[tmp] > D[j]))
tmp = j;
final[tmp] = 1;
for(int k = 0; k < n; k++)
if(final[k] == 0 && map[tmp][k] != IFINITY && D[tmp] + map[tmp][k] < D[k])
{
D[k] = D[tmp] + map[tmp][k];
parent[k] = tmp;
}
}
//
for(int i = 1; i < n; i++)
{
int tmp = i;
while(parent[tmp] != -1)
{
printf("v%d\t", tmp);
tmp = parent[tmp];
}
if(parent[i] != -1)
{
printf("v0
");
printf("v0 to v%d has a shortest distance of %d
", i, D[i]);
}
}
system("pause");
return 0;
}