西工大noj数据结构22题 迪杰斯特拉算法

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define infinity  100
typedef struct
{
	int vexs[MAX];
	int arcs[MAX][MAX];
	int arc_count,vex_count;
}graph;
typedef struct 
{
	int weight;
	int visited;
}lnode;
typedef struct 
{
	int vertex;
	int length;
	int prevex;
}path;
int main()
{
	graph p;
	path dist[MAX];
	scanf("%d %d",&p.vex_count,&p.arc_count);
	for(int i=0;i<p.vex_count;i++)
	p.vexs[i]=i+1;
	for(int i=0;i<p.vex_count;i++)
	for(int j=0;j<p.vex_count;j++)
	{
		p.arcs[i][j]=MAX;
	}
	for(int i=0;i<p.arc_count;i++)
	{
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		a--;b--;
		p.arcs[a][b]=c;
	}
	for(int i=0;i<p.arc_count;i++)
	p.arcs[i][i]=0;
	
	int  i, j, minvex;	int  min;
    dist[0].length=0;  dist[0].prevex=0;  dist[0].vertex=p.vexs[0];
    p.arcs[0][0]=1;	/* 表示顶点v0在集合U中 */
    for (i=1; i<p.vex_count; i++) {
    /* 初始化集合V-U中顶点的距离值 */
        dist[i].length=p.arcs[0][i];
        dist[i].vertex=p.vexs[i];
        if (dist[i].length!=MAX)  dist[i].prevex=0;
        else  dist[i].prevex= -1;
    }
   	int note;
    for (i=1; i<p.vex_count;i++){
        min=MAX; minvex=0;
        for (j=1; j<p.vex_count; j++)
        /*在V-U中选出距离值最小顶点*/
            if ((dist[j].length<=min)&&(p.arcs[j][j]==0)) {
                min=dist[j].length;
                minvex=j;
				note=j; 
            }
      	if(minvex==0)
      		break;
        p.arcs[minvex][minvex]=1;	/* 集合V-U中路径
			最小的顶点为minvex */
			for(j=1;j<p.vex_count;j++){
        /* 调整集合V-U中的顶点的最短路径 */
            if (dist[j].length>dist[minvex].length+p.arcs[minvex][j]) {
                dist[j].length=dist[minvex].length+p.arcs[minvex][j];
                dist[j].prevex=minvex;
            }
        }
        if(dist[note].length==MAX)
        dist[note].length=-1;
        printf("1 %d %d\n",note+1,dist[note].length);
  }
	return 0;
}
//test
/*
6 11
1 2 50
1 3 10
1 5 45
2 3 15
2 5 10
3 1 20
3 4 15
4 2 20
4 5 35
5 4 30
6 4 3
*/
/*output
1 3 10
1 4 25
1 2 45
1 5 45
1 6 -1
*/



写的不好,凑合看一下,但是确实自己写的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值