hdu2112 HDU Today

Dijkstra+stl_map    
map的简单用法可以直接看下面的代码了解下

做最短路的题要注意更新数据,之前在地图net[][]的更新上没注意,每次拿到数据就更新(实际应该先判断是否比之前的net[i][j]要小)

注意起点和终点重合的情况



#include<cstring>
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
#define MAX 155
#define inf 0x3f3f3f3f
map<string,int>M;
int net[MAX][MAX],d[MAX],v[MAX];
int s,e;
void djs(int lenth)
{
	int i,j,index,min;
	memset(d,0,sizeof(d));
	memset(v,0,sizeof(v));
	for(i=1;i<lenth;i++)
	{
		d[i]=net[s][i];
	}
	d[s]=0;
	v[s]=1;
	for(i=1;i<lenth-1;i++)
	{
		min=inf;
		index=0;
		for(j=1;j<lenth;j++)
		{
			if(v[j]==0&&d[j]<min)
			{
				min=d[j];
				index=j;
			}
		}
		if(index==0)
		{
			break;
		}
		v[index]=1;
		for(j=1;j<lenth;j++)
		{
			if(v[j]==0&&d[index]+net[index][j]<d[j])
				d[j]=d[index]+net[index][j];
		}
	}
	if(d[e]<inf)
		printf("%d\n",d[e]);
	else
		printf("-1\n");
}
int main()
{
	int i,j,l,n;
	int count;
	char a[35],b[35];
	while(scanf("%d",&n)!=EOF)
	{
		if(n==-1)
			return 0;
		M.clear();
		count=1;
		for(i=1;i<MAX;i++)
			for(j=1;j<MAX;j++)
			{
				net[i][j]=net[j][i]=inf;
				if(i==j)
					net[i][j]=net[j][i]=0;
			}
		scanf("%s %s",a,b);
		s=M[a]=count++;
		if(M[b]==0)//根据起点和终点是否重合做相应处理
			e=M[b]=count++;
		else
			e=s;
		while(n--)
		{
			scanf("%s %s %d",a,b,&l);
			if(M[a]==0)
				M[a]=count++;
			if(M[b]==0)
				M[b]=count++;
			if(net[M[a]][M[b]]>l)
				net[M[a]][M[b]]=net[M[b]][M[a]]=l;
		}
		djs(count);//把城市个数(城市个数其实是count-1个)
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值