最短路径问题【SPFA】

放在草稿箱很久了,现在才发现他

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct ooo
{
	int to,next;
}l[105];
int h[105],a[105],b[105],st[305];
int n,m,x,y,s,t,head,tail;
double f[105][105],c[105];
bool fy[105];
int main()
{
	memset(f,0x7f,sizeof(f));
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		l[++s].to=y; l[s].next=h[x]; h[x]=s;
		l[++s].to=x; l[s].next=h[y]; h[y]=s; //邻接表
	    f[x][y]=f[y][x]=sqrt((a[x]-a[y])*(a[x]-a[y])
		                    +(b[x]-b[y])*(b[x]-b[y]));
	}
	scanf("%d%d",&s,&t);
	head=0; tail=1;
	st[1]=s; fy[s]=1;
	do
	{
		head++;
		int tt=st[head];
		for(int i=h[tt];i;i=l[i].next)
		  if(c[tt]+f[tt][l[i].to]<c[l[i].to]) //如果可以更新此点
		  {
		  	c[l[i].to]=c[tt]+f[tt][l[i].to];
		  	if(!fy[l[i].to]) //如果此点不在队列里面
		  	{
		  		fy[l[i].to]=1; st[++tail]=l[i].to; //加入队列
		  	}
		  }
		fy[tt]=0; //把tt退出队列
	}while(head<tail);
	printf("%.2lf",c[t]);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值