迪杰斯特拉

                      我擦个迪杰斯特拉,这都是大二上学期的事了,现在才敲这个算法,不过还好,反正要抓紧时间了,网上有很多的迪杰斯特拉代码,貌似有点不太适合我的口味,还是什么事要自己来。

 

             

#include<stdio.h>
#define MAX 0x3fffffff //这个变量只能读 
#define MAX_SIZE 2005

int path[MAX_SIZE] = {0};
int dist[MAX_SIZE];

struct fun
{
        int v;//顶点
        int e;//边
        int p[MAX_SIZE][MAX_SIZE];
}page;


void init ()  //初始化
{
        int i = 0, j;
        for(i = 1; i <= page.v;i++)
        {
                page.p[i][i]  = 0;
                for(j = 1; j<i; j++)
                {
                        page.p[j][i] = page.p[i][j] = MAX;

                }
                dist[i] = MAX;
        }

}

void djst()
{
        int min;
        int i, j, k, t =1;
        for(i = 1; i <=page.v; i++ )
        {
                dist[i] = page.p[1][i];//记录各条最小路长度
        }

        path[1] = 1;//表示i = 0 这个节点已经选过

        for(i = 2; i<=page.v; i++)//寻找各条最短路径        
		{
                min = MAX;
                for(j = 1; j<= page.v; j++)//选择最小权值路径
					if(!path[j]&&dist[j] < min)//选择没选的点中最小点,更新最小值                       
					{
                                k = j;
                                min = dist[j];
                     }

                path[k]= 1;//record k to be choosed

                for(j = 1; j <= page.v; j++)//修改路径
                {
                        if(!path[j] &&  page.p[k][j] < MAX && dist[k]+page.p[k][j] < dist[j])//do not record the number that has thought;
                                dist[j] = dist[k] + page.p[k][j];//alter the distance
                }
        }
        printf("%d\n", dist[page.v]);
}


int main()
{
        int x, y, value;
        int i, j;
        while(scanf("%d%d", &page.e, &page.v) != EOF)
        {
                init();
                for(i = 1; i <= page.e; i++)
                {    
                        scanf("%d%d%d",&x, &y, &value);
                   
                        if(page.p[y][x] > value)
                                page.p[y][x] = page.p[x][y] = value;
                }

                djst();

        }
        return 0;
}


 

 

还有一份迪杰斯特拉代码:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>  //定义整型数据范围的
#define  Max 10000




typedef struct {
    int Vexnum;
    int Arcnum;
    int Arc[Max][Max];
}Mgraph ;

void Init(Mgraph *G)
{
    int i,j,temp;
    int Vex_1,Vex_2;
    for(i=1;i<=G->Vexnum;i++)
        for(j=1;j<=G->Vexnum;j++)
            G->Arc[i][j]=INT_MAX;
    for(i=1;i<=G->Arcnum;i++)
    {
        scanf("%d%d%d",&Vex_1,&Vex_2,&temp);
        G->Arc[Vex_1][Vex_2]=temp;
        G->Arc[Vex_2][Vex_1]=temp;

    }
}

void Dijkstra(Mgraph *G,int start)
{
    int i,j,l;
    int k,min_len;
    int Dist[Max],Path[Max];
    Path[Max]={0};
    for(i=1;i<=G->Vexnum;i++)
        if(i!=start)
            Dist[i]=G->Arc[start][i];
    Path[start]=1;
    for(i=1;i<=G->Vexnum;i++)
        printf("%d\t",Dist[i]);
    printf("\n");

    for(i=1;i<G->Vexnum;i++)
    {
        min_len=INT_MAX;
        for(l=1;i<=G->Vexnum;l++)
            if(!Path[l]&&Dist[l]<min_len)
            {
                printf("%d\n",l);
                k=l;
                min_len=Dist[l];
            }
        Path[k]=1;
        printf("%d到%d的最短路径为%d\n",start,k,Dist[k]);
        for(j=1;j<=G->Vexnum;j++)
            if(!Path[i]&&G->Arc[k][j]<INT_MAX&&G->Arc[k][j]+Dist[k]<Dist[j])
                Dist[j]=G->Arc[k][j]+Dist[j];
    }
}


int main(void)
{
    Mgraph *G;
    G=(Mgraph *)malloc(sizeof(Mgraph));
    printf("请输入点的个数,边的个数(x y):\n");
    scanf("%d%d",&G->Vexnum,&G->Arcnum);
    Init(G);
    for(int i=1;i<=G->Vexnum;i++)
    {
        for(int j=1;j<=G->Vexnum;j++)
            printf("%d\t",G->Arc[i][j]);
        printf("\n");
    }
    Dijkstra(G,1);
    return 0;
}


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值