菜鸡的spfa算法出最短路。。。

emmm....写给自己看的东西。。。请各位大佬给予帮助咯。。。桑代码!

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
typedef struct{
	int to,q,next;
}fhs;//邻接链表~~~ 
int head[510000],dist[510000],x,y,z,c,w,u,en=0;//dist为最短路大小,head邻接链表需要记录的头部。 
fhs pp[1001000];//建立表 
bool bj[510000];//标记数组记录是否存入了其中 
queue<int> q;//使用队列 
const int o=2147483647;//最大值 
void addd(int x,int y,int z)//添加方式 
{
	pp[en].next=head[x];//用next记录上一个已x为起点的路的位置 
	pp[en].q=z; //每条路的权值 
	pp[en].to=y; //到哪个位置 
	head[x]=en++; // 记录起点为这个位置的最后一个到达位置的数组下标(邻接链表,不解释了) 
}
void ks()//初始输入 
{
	scanf("%d%d%d",&w,&u,&c);//输入(几个点,几条路,初始位置) 
	memset(head ,-1,sizeof(head));//赋值为-1,好结束 
	fill(dist,dist+u+1,o);//赋值为最大值,用于比较 
	fill(bj,bj+u+1,false);//全部赋值为未放入 
	for(int i=0;i<u;i++)//输入路的值 
	{
		scanf("%d%d%d",&x,&y,&z);//x为初始位置,y为到达位置,z为权值 
		addd(x,y,z);//放入 
	}
	dist[c]=0;	//将初始位置的最小权值点位0(你不用走就到了不是吗?) 
}
void spfa()//算法开始~ 
{
	q.push(c);//放入初始位置 
	bj[c]=true;//将初始位置标记 
	while(!q.empty())//感觉特别像bfs。。。不过就是这样。。,开始遍历图 
	{
		int uu=q.front();//首个 
		q.pop();//拿出 
		bj[uu]=false;//标记这个未录入。。(感觉像是在说废话) 
		for(int i=head[uu];i!=-1;i=pp[i].next)//利用邻接链表性质,不断追溯相同初始位置的上一条路 
		{
			int vv=pp[i].to;//不想说。。。 
			if(dist[vv]>dist[uu]+pp[i].q)//当我从到现在位置的最小值加上移动到目标位置的值要小时,那就用替代它; 
			{
				dist[vv]=dist[uu]+pp[i].q;//
				if(!bj[vv])//防止重复 
				{
					q.push(vv);//放入点 
					bj[vv]=true;//。。。 
				}
			}
		}
	}
}
int main()
{
	ks(); //初始 
	spfa(); // 算法 
	for(int i=1;i<=w;i++)//输出到每一个的最小值。。。 
	{
		printf("%d",dist[i]);
		if(i!=w)
		{
			printf(" ");
		}
	}
	return 0;
}
感觉像是bfs。。。。是我的错觉吧。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值