ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

C语言/shell(awk)迪杰斯特拉求最短路径

2021-06-12 12:01:40  阅读:240  来源: 互联网

标签:map shell int visit 迪杰 pos len C语言 节点


C:

#include<stdio.h>

#define SIZE 110  
#define INF 1000000;  //假设无路径的两个点的距离为100(随便设个数,无穷大也可)

int map[SIZE][SIZE];  //邻接矩阵存储 
int len[SIZE];  	//d[i]表示源点到i这个点的距离 
int visit[SIZE];  //节点是否被访问 
int n, m;

int dijkstra(int from, int to) {	//从源点到目标点 

    int i;

    for (i = 1; i <= n; i++) {	//初始化 
        visit[i] = 0;	//一开始每个点都没被访问 
        len[i] = map[from][i];	//先假设源点到其他点的距离 
    }

    int j;
    for (i = 1; i < n; i++) {	//对除源点的每一个点进行最短计算  //确定轮数,共进行n轮
        int min = INF;  //记录最小len[i] 
        int pos;  //记录小len[i] 的点 
       // visit[1] = 1;

        for (j = 1; j <= n; ++j) {
            if (!visit[j] && min > len[j]) {
                pos = j;
                min = len[j];
            }
        }
        visit[pos] = 1;  //pos=2;

        for (j = 1; j <= n; ++j) { //每一轮的循环
            if (!visit[j] && (len[j] > (len[pos] + map[pos][j]))) { //如果j节点没有被访问过&&j节点到源节点的最短路径>pos节点到源节点的最短路径+pos节点到j节点的路径  
                len[j] = len[pos] + map[pos][j];	//更新j节点到源节点的最短路径	
           //     printf("%d\n", j);

            }
        }
    }

    return len[to];
}


int main() {

    int i, j;

    //  scanf("%d%d",&n,&m);	//输入数据
    n = 6;	//测试数据 点数
    m = 9;  //边数

    for (i = 1; i <= n; ++i) {	//设一开始每个点都不可达 
        for (j = 1; j <= n; ++j) {
            map[i][j] = INF;
        }
    }

    /*	int a,b,c;	//输入数据
        for(i = 1 ; i <= m ; ++i){
            scanf("%d%d%d",&a,&b,&c);
            map[a][b] = map[b][a] = c;
        }  */

    map[1][2] = 7;	//测试数据 
    map[1][3] = 9;
    map[1][6] = 14;
    map[2][3] = 10;
    map[2][4] = 15;
    map[3][6] = 2;
    map[5][6] = 9;
    map[4][5] = 6;
    map[3][4] = 11;
    int temp = INF;
    for (i = 1; i <= n; ++i) {
        for (j = 1; j <= n; ++j) {
            if (map[i][j] == temp)
                map[i][j] = map[j][i];
        }
    }

    int ans = dijkstra(1, 5);

    printf("%d\n", ans);
    // printf("%d\n", map[1][4],len[4]);

    return 0;
}

/*	边的数据
1 2 7
1 3 9
1 6 14
2 3 10
2 4 15
3 6 2
5 6 9
4 5 6
3 4 11
*/

shell:

BEGIN{
bar=1
}
{}
END{
n=6  #spot
m=9  #edge
INF=1000000

for(i=1;i<=n;i++){
    for(j=1;j<=n;j++)
	map[i][j]=INF
}

#input edge 
map[1][2]=7
map[1][3]=9
map[1][6]=14
map[2][3]=10
map[2][4]=15
map[3][4]=11
map[3][6]=2
map[4][5]=6
map[5][6]=9

temp=INF

for(i=1;i<=n;i++){
    for(j=1;j<=n;j++){
	if(map[i][j]==temp)
	    map[i][j]=map[j][i]
    }
}

ans=dijkstra(1,5)
printf("%d\n",ans)



}


function dijkstra(from,to){
for(i=1;i<=n;i++){
    visit[i]=0
    len[i]=map[from][i]
}

for(i=1;i<n;i++){
    min=INF
    for(j=1;j<=n;j++){
	if(!visit[j] && min>len[j]){
	    pos=j
	    min=len[j]
	}
    }
    visit[pos]=1
    for(j=1;j<=n;j++){
	if(!visit[j] && (len[j]>(len[pos]+map[pos][j])))
	    len[j]=len[pos]+map[pos][j]
    }

}
return len[to]
}

























标签:map,shell,int,visit,迪杰,pos,len,C语言,节点
来源: https://blog.csdn.net/m0_45363137/article/details/117842708

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有