发现没什么人写这种基础代码的blog,不带教学记录一下自己写的。
明明是简单的东西但是有的时候脑子就是转不过来,乌鱼子
最短路径 (20分)
给定一个有N个顶点和E条边的无向图,顶点从0到N−1编号。请判断给定的两个顶点之间是否有路径存在。如果存在,给出最短路径长度。 这里定义顶点到自身的最短路径长度为0。 进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。 随后E行,每行给出一条边的两个顶点。每行中的数字之间用1空格分隔。 最后一行给出两个顶点编号i,j(0≤i,j<N),i和j之间用空格分隔。
输出格式:
如果i和j之间存在路径,则输出"The length of the shortest path between i and j is X.",X为最短路径长度, 否则输出"There is no path between i and j."。
输入样例1:
7 6
0 1
2 3
1 4
0 2
1 3
5 6
0 3
输出样例1:
The length of the shortest path between 0 and 3 is 2.
输入样例2:
7 6
0 1
2 3
1 4
0 2
1 3
5 6
0 6
输出样例2:
There is no path between 0 and 6.
代码
基础dijkstar实现
#include <stdio.h>
int m,n,end,had[11]={0},len[11]={0},path[11][11]={0};
void bdPath(int start,int pathL){
int i,size=0,temp[11];
for(i=0;i<m;i++){
if(path[start][i]==1&&had[i]==0){
len[i]=pathL;
had[i]=1;
temp[size++]=i;
//printf("%d %d\n",i,pathL);
if(i==end)
return;
}
}
while(size--){
bdPath(temp[size],pathL+1);
}
}
int main(){
int i,a,b;
scanf("%d %d",&m,&n);
for(i=0;i<n;i++){
scanf("%d %d",&a,&b);
path[a][b]=path[b][a]=1;
}
int start;
scanf("%d %d",&start,&end);
had[start]=1;
len[start]=0;
bdPath(start,1);
if(had[end]==0){
printf("There is no path between %d and %d.",start,end);
}
else{
printf("The length of the shortest path between %d and %d is %d.",start,end,len[end]);
}
}