|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
编写的时候思想如下:
二维矩阵存储两个节点之间边的权重,若不相连接为INF
首先从节点1开始,1和其他节点之间的权重,若不为INF则可能是最短路径,进行判断
判断:1 存储到目标点的值为0,此时看目标点是否为0,如果目标点是1则不许修改,否则修改成到当前点的值加上当前点到目标点的值
2 判断到目标点的值是否小于当前点的值加上当前点到目标点的值,如果是,修改成当前点的值加上当前点到目标点的值
一轮循环之后取最短的路径并将其在buf中的对应位置1表示已取得最小值,然后将下一边轮换的节点换成此值然后进行下一轮循环
当buf中所有值都为1时跳出循环,返回数组,数组中的值是从节点1到其他节点的最短路径,在main之中打印出来
代码如下:- #include <stdio.h>
- #define INF 1000
- int * Dijiesitela(int [][8]);
- int get_min(int * tar,int * exi,int n);
- int all(int * n);
- int main(void)
- {
- int * DJ_return;
- int dis [][8] = {
- {0,1,INF,INF,INF,INF,7,INF},
- {1,0,2,INF,INF,INF,INF,9},
- {INF,2,0,3,INF,INF,INF,INF},
- {INF,INF,3,0,4,INF,INF,INF},
- {INF,INF,INF,4,0,5,INF,10},
- {INF,INF,INF,INF,5,0,6,INF},
- {7,INF,INF,INF,INF,6,0,8},
- {INF,9,INF,INF,10,INF,8,0}
- };
- DJ_return = Dijiesitela(dis);
- for(int i = 0;i<8;i++)
- printf("%d\r\n",*DJ_return);
- return 0;
- }
- int * Dijiesitela(int dir[][8])
- {
- int buf_return[8] = {0};
- int buf[8] = {0};
- buf [0] = 1;
- int i,j,k;
- i = j = k =0;
- while(1)
- {
- for(i=0;i<8;i++)
- {
- if(dir[k][i]!=INF) //!=INF的话才可能成最短路径
- {
- if((!buf_return[i]&&i!=0) || (buf_return[k]+dir[k][i]<buf_return[i])) //如果buf_return[i]==0,之前没有路径直接给值
- buf_return[i] = buf_return[k]+dir[k][i];
- }
- }
- j = get_min(buf_return,buf,8);
- k = j-1;
- buf[k] = 1;
- if(all(buf))
- break;
- }
- return buf_return;
- }
- int get_min(int * tar,int * exi,int n)
- {
- int i;
- int min = 0;
- int i_return;
- for(i=0;i<n;i++)
- {
- if(!exi[i])
- {
- if(!min)
- {
- if(tar[i])
- {
- min = tar[i];
- i_return = i;
- }
- }
- else if(tar[i]<min)
- {
- min = tar[i];
- i_return = i;
- }
- }
- }
- return i_return+1;
- }
- int all(int * n)
- {
- int counter;
- for(int i =0;i<8;i++)
- {
- if(*(n+i) == 1)
- counter ++;
- }
- if(counter == 8)
- return 1;
- return 0;
- }
复制代码
编译通过,但是卡死了,条件限制debug不了,求帮忙看看哪里出了问题 |
|