HDU2544 spfa

#include"iostream"
#include"cstdio"
#include"cstdlib"
#include"cstring"
#include"queue" 

using namespace std;

int u[70005];
int v[70005];
int w[70005];
int first[105];
int nextk[20010];
int n,m;
int a,b,c;
int book[105];
int dis[105];

void spfa()
{
	std::queue<int> q;
	q.push(1);
	book[1]=1;
	while(!q.empty())
	{
		int k=first[q.front()];
		book[q.front()]=0;
		q.pop();
		while(k!=-1)
		{
			if(dis[v[k]]>dis[u[k]]+w[k]) 
			{
				dis[v[k]]=dis[u[k]]+w[k];
				if(book[v[k]]==0)
				{
					q.push(v[k]);
			    	book[v[k]]=1;
				}
			}
			k=nextk[k];
		}
	}
}

int main()
{
	while(scanf("%d%d",&n,&m)==2&&n!=0&&m!=0)
	{
		for(int i=1;i<=m;i++)
		{
			cin>>u[i]>>v[i]>>w[i];
		}
		for(int i=m+1;i<=2*m;i++)
		{
			u[i]=v[i-m];
			v[i]=u[i-m];
			w[i]=w[i-m];
		}
		memset(first,-1,sizeof(first));
		memset(nextk,0,sizeof(nextk));
		for(int i=1;i<=2*m;i++)
		{
			nextk[i]=first[u[i]];
			first[u[i]]=i;
		}
		for(int i=1;i<=n;i++)
		{
			dis[i]=9999999;
		}
		dis[1]=0;
		spfa();
		cout<<dis[n]<<endl;
	}
	return 0;
}
这道题万分小心,邻接表对于无向图的话,要小心RE 数组越界,u,v,w数组中下标代表的是边数不是点数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值