HDU1874 (dijkstral算法)

居然有重边.....

有重边也就罢了居然可以起点和终点一样!!

1:重边选择最小的;

2:起点和终点相同的时候输出0.

这样就行了.

#include <stdio.h>
#include <string.h>
#define MAX 1000000
int maps[202][202];
int M,N;
int visited[202],lowcost[202];
void init()
{
	int i,h;
	int x,y,z;
	
	for(i=0;i<N;i++)
		for(h=0;h<N;h++)
			maps[i][h]=MAX;

	for(i=0;i<M;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		if(maps[x][y]>z)
			maps[x][y]=maps[y][x]=z;
	}
}
void dijkstral(int begin,int end)
{
	int i,min,h,temp;
	memset(visited,0,sizeof(visited));
	memset(lowcost,0,sizeof(lowcost));
	for(i=0;i<N;i++)
		lowcost[i]=maps[begin][i];
	visited[begin]=1;

	while(1)
	{
		min = MAX;
		temp = begin;
		for(i=0;i<N;i++)
		{
			if(!visited[i]&&min>lowcost[i])
			{
				min=lowcost[i];temp=i;
			}
		}
		
		if(temp==begin)break;
		visited[temp]=1;
		for(h=0;h<N;h++)
		{
			if(!visited[h])
			if(maps[temp][h]+min<lowcost[h])
				lowcost[h]=maps[temp][h]+min;
		}
	}
}
int main()
{
	int begin,end;
	while(~scanf("%d%d",&N,&M))
	{
		init();
		scanf("%d%d",&begin,&end);
		if(begin==end)
			printf("0\n");
		else
		{
			dijkstral(begin,end);
			if(visited[end])
				printf("%d\n",lowcost[end]);
			else
				printf("-1\n");
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值