【Class 学习笔记】 单源点最短
一、前言
这是作业 ,没怎么深入,BUT记录.
算法这种东西,如果只是重复前人的成果,实在没什么意思。我觉得至少我们学校的算法教学是有问题的,大家都还不会分析,就直接读代码,什么空间复杂度的分析,时间复杂度的分析都还搞不懂,连怎么分析都不知道怎么可能能够设计出算法......MIT的算法导论不错。
二、资源
1、单源点的基本思想,认真看一遍就可以懂的:
http://www.cnblogs.com/xiaosuo/archive/2010/03/23/1656921.html#2232020
2、有向图的储存
邻接矩阵或者是链表
三、My代码
纯记录
邻接矩阵
#include <stdio.h>
#include <stdlib.h>
#define VER_NUMBER 7
#define MAXUM 1000
/*获取下一个目标节点*/
int getMin(int dist[],int s[])
{
int i;
int tmp_minver=0;
for(i=0;i<VER_NUMBER;i++)
{
if(1==s[tmp_minver]) tmp_minver++;
else if(0!=dist[i]&&1!=s[i]&&dist[i]<dist[tmp_minver]) tmp_minver=i;
}
return tmp_minver;
}
/*获取最短路径*/
void getShortest(int v,int cost[][VER_NUMBER],int dist[],int road[])
{
int i,j,n;
int tmp_len=0;
int tmp_ver=0;
int s[VER_NUMBER];
for(i=0;i<VER_NUMBER;i++)
{
s[i]=0;
dist[i]=cost[v-1][i];
road[i]=v-1;
}
s[v-1]=1;
dist[v-1]=0;
for(j=1;j<VER_NUMBER;j++)
{
/*确定当前选定节点*/
tmp_ver=getMin(dist,s);
s[tmp_ver]=1;
for(n=0;n<VER_NUMBER;n++)
{
if(0==s[n]){
/*更改最短路径,保存最短路径的上一个节点*/
tmp_len=dist[tmp_ver]+cost[tmp_ver][n];
if(dist[n]>tmp_len){
dist[n]=tmp_len;
road[n]=tmp_ver;
}
}
tmp_len=0;
}
}
}
int main(){
int i,j;
int dist[VER_NUMBER]={0,0,0,0,0,0,0};
int map[VER_NUMBER][VER_NUMBER]={
{MAXUM,20,50,30,MAXUM,MAXUM,MAXUM},
{MAXUM,0,25,MAXUM,MAXUM,70,MAXUM},
{MAXUM,MAXUM,0,40,25,50,MAXUM},
{MAXUM,MAXUM,MAXUM,0,55,MAXUM,MAXUM},
{MAXUM,MAXUM,MAXUM,MAXUM,0,10,70},
{MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,0,50},
{MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,0}
};
int road[VER_NUMBER]={0,0,0,0,0,0,0};
int start=1;
getShortest(start,map,dist,road);
for(i=0;i<VER_NUMBER;i++)
{
printf("Ver 1 To Ver %d: %d\n",i+1,dist[i]);
printf("ROAD:\n");
printf("%d",i+1);
for(j=i;j<VER_NUMBER&&0!=road[j];)
{
printf("<-%d",road[j]+1);
j=road[j];
}
printf("<-%d\n",start);
}
return 1;
}
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define VER_NUMBER 7
4 #define MAXUM 1000
5
6
7 int getMin(int dist[],int s[])
8 {
9 int i;
10 int tmp_minver=0;
11 for(i=0;i<VER_NUMBER;i++)
12 {
13 if(1==s[tmp_minver]) tmp_minver++;
14 else if(0!=dist[i]&&1!=s[i]&&dist[i]<dist[tmp_minver]) tmp_minver=i;
15 }
16 return tmp_minver;
17 }
18
19
20
21 void getShortest(int v,int cost[][VER_NUMBER],int dist[],int road[])
22 {
23 int i,j,n;
24 int tmp_len=0;
25 int tmp_ver=0;
26 int s[VER_NUMBER];
27 for(i=0;i<VER_NUMBER;i++)
28 {
29 s[i]=0;
30 dist[i]=cost[v-1][i];
31 road[i]=v-1;
32 }
33 s[v-1]=1;
34 dist[v-1]=0;
35 for(j=1;j<VER_NUMBER;j++)
36 {
37 tmp_ver=getMin(dist,s);
38 s[tmp_ver]=1;
39 for(n=0;n<VER_NUMBER;n++)
40 {
41 if(0==s[n]){
42 tmp_len=dist[tmp_ver]+cost[tmp_ver][n];
43 if(dist[n]>tmp_len){
44 dist[n]=tmp_len;
45 road[n]=tmp_ver;
46 }
47 }
48 tmp_len=0;
49 }
50 }
51 }
52
53 int main(){
54
55 int i,j;
56 int dist[VER_NUMBER]={0,0,0,0,0,0,0};
57 int map[VER_NUMBER][VER_NUMBER]={
58 {MAXUM,20,50,30,MAXUM,MAXUM,MAXUM},
59 {MAXUM,0,25,MAXUM,MAXUM,70,MAXUM},
60 {MAXUM,MAXUM,0,40,25,50,MAXUM},
61 {MAXUM,MAXUM,MAXUM,0,55,MAXUM,MAXUM},
62 {MAXUM,MAXUM,MAXUM,MAXUM,0,10,70},
63 {MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,0,50},
64 {MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,0}
65 };
66 int road[VER_NUMBER]={0,0,0,0,0,0,0};
67 int start=1;
68 getShortest(start,map,dist,road);
69 for(i=0;i<VER_NUMBER;i++)
70 {
71 printf("Ver 1 To Ver %d: %d\n",i+1,dist[i]);
72 printf("ROAD:\n");
73 printf("%d",i+1);
74 for(j=i;j<VER_NUMBER&&0!=road[j];)
75 {
76 printf("<-%d",road[j]+1);
77 j=road[j];
78 }
79 printf("<-%d\n",start);
80 }
81 return 1;
82
83 }
84
85
86