迪杰斯特拉的自我理解代码

#include <stdio.h>
#define N 1005
#define inf 1<<20
int dist[N],dis[N][N];
int book[N];
int u,v;
int n,m;
int t,t1,t2;
void input()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j) dis[i][j]=0;
			else dis[i][j]=inf;?
		}
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d %d",&t1,&t2,&t);
		dis[t1][t2]=t;
		dis[t2][t1]=t;
	}
	for(int i=1;i<=n;i++)
	{
		dist[i]=dis[1][i];
	}
}
void dijkstra(int n)
{
	book[1]=1;
	int p;
	for(int i=1;i<=n;i++)
	{
		int temp=inf;// 一定注意,写到里面!!!!?
		for(int j=1;j<=n;j++)
		{
			if(!book[j]&&dist[j]<temp)
			{
				p=j;
				temp=dist[j];
			}
		}
		book[p]=1;
		for(int k=1;k<=n;k++)
		{
			if(dis[p][k]<inf)
			{
				if(dist[k]>dist[p]+dis[p][k])
				{
					dist[k]=dist[p]+dis[p][k];
				}
			}
		}
	}
}
int main()
{
	scanf("%d %d",&n,&m);
	input();
	dijkstra(n);
	for(int i=1;i<=n;i++)
	{
		printf("%d ",dist[i]);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现的斯特算法的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <limits.h> #define MAX_NODES 100 // 结点的数据结构 typedef struct { int cost; // 距离起始节点的最短距离 int visited; // 是否已经被访问过 int prev_node; // 前一个节点 } Node; // 斯特算法函数 void dijkstra(int graph[MAX_NODES][MAX_NODES], int num_nodes, int start_node) { Node nodes[MAX_NODES]; // 存储所有节点的信息 int i, j; // 初始化节点信息 for (i = 0; i < num_nodes; i++) { nodes[i].cost = INT_MAX; nodes[i].visited = 0; nodes[i].prev_node = -1; } nodes[start_node].cost = 0; // 起始节点到自身的距离为0 for (i = 0; i < num_nodes; i++) { int min_cost = INT_MAX; int min_node = -1; // 找到当前距离起始节点最近的未访问节点 for (j = 0; j < num_nodes; j++) { if (!nodes[j].visited && nodes[j].cost < min_cost) { min_cost = nodes[j].cost; min_node = j; } } if (min_node == -1) { break; // 所有节点都已经访问过,退出循环 } nodes[min_node].visited = 1; // 将最近的节点标记为已访问 // 更新与最近节点相邻节点的距离 for (j = 0; j < num_nodes; j++) { if (graph[min_node][j] != 0 && nodes[j].visited == 0) { int new_cost = nodes[min_node].cost + graph[min_node][j]; if (new_cost < nodes[j].cost) { nodes[j].cost = new_cost; nodes[j].prev_node = min_node; } } } } // 输出最短路径 for (i = 0; i < num_nodes; i++) { printf("Node %d: Cost = %d, Previous Node = %d\n", i, nodes[i].cost, nodes[i].prev_node); } } int main() { int graph[MAX_NODES][MAX_NODES]; // 图的邻接矩阵 int num_nodes, start_node; int i, j; printf("Enter the number of nodes: "); scanf("%d", &num_nodes); printf("Enter the adjacency matrix:\n"); for (i = 0; i < num_nodes; i++) { for (j = 0; j < num_nodes; j++) { scanf("%d", &graph[i][j]); } } printf("Enter the start node: "); scanf("%d", &start_node); dijkstra(graph, num_nodes, start_node); return 0; } ``` 这段代码实现了斯特算法,通过输入图的邻接矩阵和起始节点,输出每个节点到起始节点的最短距离和前一个节点。请注意,这只是一个简单的实现示例,实际应用中可能需要根据具体情况进行适当修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值