ola2672978400 oj最短路径

本文介绍了如何使用Dijkstra算法寻找图中从顶点1到其他顶点的最短路径,通过`build_Graph`函数构建带权重的图,`dijkstra`函数实现算法核心,`Path`函数则展示了路径输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#define MAX_VERTEX_NUM 50//顶点个数
#define INF 100000000

int U[MAX_VERTEX_NUM] = {1,1,2,2,3,3,4,4,4,4,5,7};
int V[MAX_VERTEX_NUM] = {2,4,4,5,1,6,3,5,6,7,7,6};
int C[MAX_VERTEX_NUM] = {2,1,3,10,4,5,2,2,8,4,6,1};
int adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int dis[MAX_VERTEX_NUM];
int vis[MAX_VERTEX_NUM];
int pre[MAX_VERTEX_NUM];

void build_Graph(int x, int y){
	int i=1; 
    for(i=1;i<=7;i++){
    	int j=1;
        for( j=1;j<=7;j++){
            if(i==j)adj[i][j]=0;
            else adj[i][j] = INF;
        }
    }
    i=0;
    for(i=0;i<12;i++){
        if(U[i] == x && V[i] == y) continue;
        adj[U[i]][V[i]] = C[i];
    }
}


void dijkstra(int v)
{
    int i, j, u , min;
    for(i=1;i<=7;i++)
    {
        dis[i]=adj[v][i];
        vis[i]=0;
        if(i!=v&&adj[v][i]!=INF) pre[i] = v;
        else pre[i] = -1;
    }
    vis[v]=1;dis[v]=0;
    for(i=1;i<7;i++)
    {
        min = INF;
        for(j=1;j<=7;j++)
        {
            if(!vis[j]&&min > dis[j])
            {
                min = dis[j];
                u = j;
            }
        }
        if(min == INF)break;
        vis[u]=1;
        for(j=1;j<=7;j++)
        {
            if(!vis[j]&&adj[u][j]!=INF&&dis[u]+adj[u][j]<dis[j])
            {
                dis[j] = adj[u][j] + dis[u];
                pre[j] = u;
                //printf("%d ",j);
                //printf("%d\n",pre[j]);
            }
        }
    }
}

void Path(int v)
 {
 	if(v==1)
 	{//设置递归的返回条件 
 		printf("%d",1);
        return;
	 }
	Path(pre[v]);
	printf(",%d",v);
 }


 int main(){
   int n,m;
   scanf("%d,%d",&n,&m);
   build_Graph(n,m);
   dijkstra(1);
   //int i=1;
   //for(i=1;i<=7;i++)
   //printf("%d \n",pre[i]); 
   Path(6);
   printf("\n");
   return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值