(hdoj)(图论加强)hdoj 1874(由此可以证明我的dij是可以不以第一个点当起点的)

本文介绍了一个使用Dijkstra算法解决最短路径问题的C++程序实现。该程序通过定义全局变量来存储地图信息,并利用嵌套循环来遍历所有可能的路径,最终找到从起点到终点的最短距离。

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

#include<iostream>
#include<stdio.h>
using namespace std;
//#define MAX 12
#define MAX 206
#define INF 1000002
int map[MAX][MAX];
int visited[MAX];
int cost[MAX];
int point,road;
int start,end;

int min(int a,int b)
{
	if(a>b)
		return b;
	return a;
}

//初始化
void init()
{
	int i,j;
	for(i=0;i<MAX;i++)
	{
		for(j=0;j<MAX;j++)
		{
			map[i][j]=INF;
		}
		visited[i]=0;
		cost[i]=INF;
	}
}

//从已经访问过的集合当中,找到下一个可以访问的点
int noroad()
{
	int i=0;int j=0;
	for(i=0;i<point;i++)
	{
		if(visited[i]==1)
		{
			for(j=0;j<point;j++)
			{
				if(visited[j]==0&&map[i][j]!=INF)
				{
					return 0;
				}
			}
		}
	}
	return 1;
}

void dij()
{
	visited[start]=1;cost[start]=0;
	while(!noroad())
	{

		//从s当中选择一个点,作为中间点,使得从start到T当中点
		int i=0;int j=0;int tmin=INF;int tj;
		for(i=0;i<point;i++)
		{
			if(visited[i]==1)
			{
				for(j=0;j<point;j++)
				{
					if(map[i][j]!=INF&&visited[j]==0)
					{
						if(tmin>cost[i]+map[i][j])
						{
							tmin=cost[i]+map[i][j];
							tj=j;
						}
					}
				}
			}
		}//for
		visited[tj]=1;
		cost[tj]=tmin;

		//更新
		for(i=0;i<point;i++)
		{
			if(visited[i]==0)
			{
				cost[i]=min(cost[i],cost[tj]+map[tj][i]);
			}
		}
	}
}
 
int main()
{
	//freopen("in.txt","r",stdin);
	while(scanf("%d %d",&point,&road)!=EOF)
	{
		//初始化
		init();

		//输入
		int i=0;


		for(i=0;i<road;i++)
		{
			int x,y,z;
			scanf("%d %d %d",&x,&y,&z);
			if(map[x][y]>z)
			{
				map[y][x]=z;
				map[x][y]=z;
			}
			
		}

		scanf("%d %d",&start,&end);

		//处理
		dij();

		if(cost[end]==INF)
		{
			cout<<"-1"<<endl;
		}
		else
		{
			cout<<cost[end]<<endl;
		}

	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值