题目描述:http://uva.onlinejudge.org/external/5/567.html
典型的最短路径问题,采用dijkstra算法实现如下:
/*
* 567.cc
*
* Created on: Jan 8, 2013
* Author: root
*/
#include <stdio.h>
#include <string.h>
const int INF = 100;
int graph[21][21];
int length[21];
int visit[21];
void dijkstra(int start) {
for (int i=0; i<21; i++)
length[i] = INF;
length[start] = 0;
memset(visit, 0, sizeof(visit));
for (int i=1; i<21; i++) {
int min_lenth = INF, min;
for (int j=1; j<21; j++) {
if (!visit[j] && length[j]<min_lenth) {
min_lenth = length[min=j];
}
}
for (int j=1; j<21; j++) {
if (graph[min][j]>-1 && (graph[min][j]+length[min])<length[j]) {
length[j] = graph[min][j]+length[min];
}
}
visit[min] = 1;
}
}
int main(int argc, char** argv) {
int turn=1;
while (true) {
memset(graph, -1, sizeof(graph));
int number;
for (int i=1; i<20; i++) {
if(scanf("%d", &number) == EOF)
return 0;
int target;
for (int j=0; j<number; j++) {
scanf("%d", &target);
graph[i][target] = 1;
graph[target][i] = 1;
}
}
int cases, start, stop;
scanf("%d", &cases);
printf("Test Set #%d\n", turn++);
for (int i=0; i<cases; i++) {
scanf("%d%d", &start, &stop);
dijkstra(start);
printf("%2d to %2d:%2d\n", start, stop, length[stop]);
}
printf("\n");
}
return 0;
}
而采用floyd算法实现则更为简单:
/*
* 567.cc
*
* Created on: Jan 8, 2013
* Author: root
*/
#include <stdio.h>
#include <string.h>
const int INF = 100;
int graph[21][21];
void floyd() {
for (int i=1; i<21; i++)
for (int j=1; j<21; j++)
for (int k=1; k<21; k++) {
if (graph[j][i]+graph[i][k] < graph[j][k]) {
graph[j][k] = graph[j][i]+graph[i][k];
}
}
}
int main(int argc, char** argv) {
int turn=1;
while (true) {
for (int i=0; i<21; i++)
for (int j=0; j<21; j++)
graph[i][j] = i==j ? 0 : INF;
int number;
for (int i=1; i<20; i++) {
if(scanf("%d", &number) == EOF)
return 0;
int target;
for (int j=0; j<number; j++) {
scanf("%d", &target);
graph[i][target] = 1;
graph[target][i] = 1;
}
}
int cases, start, stop;
scanf("%d", &cases);
printf("Test Set #%d\n", turn++);
for (int i=0; i<cases; i++) {
scanf("%d%d", &start, &stop);
floyd();
printf("%2d to %2d:%2d\n", start, stop, graph[start][stop]);
}
printf("\n");
}
return 0;
}
但是采用floyd算法运行时间要长很多,这是在uva上运行的结果:
11115239 567 Risk Accepted C++ 1.512 2013-01-08 09:51:32
11115165 567 Risk Accepted C++ 0.440 2013-01-08 09:32:06