HDU 2544 最短路 Dijkstra

本文详细解析了一道使用Dijkstra算法解决的模板题。通过给出的数据实例,展示了如何构建临界矩阵并应用Dijkstra算法求解最短路径问题。

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

/*
很简单的模版题...Dijkstra应该就不用多说了...算法比较简单...尤其是数据结构中的...所以流程图都有...大家一搜一大堆我就不赘述了...赘述也是多余
给几组数据
3 3
1 2 1
1 3 3
2 3 1
3 1
1 2 1
6 9
1 2 7
1 3 9
1 4 14
2 3 10
2 5 15
3 4 2
3 5 11
4 6 9
5 6 6
6 8
1 3 10
1 5 30
1 6 100
2 3 5
3 4 50
4 6 10
5 4 20
5 6 60

****************************************************
2
-1 
20 
60*/
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 0x3fffffff;
const int V = 200;
int dijkstra(int map[][V],int start,int end,int n) //map为临界矩阵,n为矩阵大小
{	
	int final[V],track[V],i,j,ant=n*n;
	memset(track,0,sizeof(track));
	for(i=1;i<=n;i++)
		final[i]=map[start][i]!=0?map[start][i]:INF;
	track[start]=1;
	while(ant--)
	{
		int judge=1,min=INF,getmin=start;
		for(i=1;i<=n;i++)
			judge*=track[i];
		if(judge) 	return final[end];
		for(i=1;i<=n;i++)
		{
			if( final[i] < min && final[i]!=INF && track[i]==0)
			{
				getmin = i;
				min = final[i];
			}
			final[i] = final[start]+(map[start][i]==0?INF:map[start][i]) < final[i] ? final[start]+(map[start][i]==0?INF:map[start][i]) : final[i];
		}
		track[getmin]=1;
		start = getmin;	
	}
	return -1;
}
int main()
{
//	freopen("in.txt","r",stdin);
	int i,j,n,m,map[V][V];
	while(cin>>n>>m && (n!=0 || m!=0))
	{
		memset(map,0,sizeof(map));
		while(m--)
		{
			int a,b,c;
			cin>>a>>b>>c;
			if(map[a][b]!=0)
			{
				map[a][b] = c<map[a][b]?c:map[a][b];
				map[b][a] = map[a][b];
			}else 
			{
				map[b][a]=c;
				map[a][b]=c;
			}
		}
		//int start,end;
		//cin>>start>>end;
		cout<<dijkstra(map,1,n,n)<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值