随便打的不是spfa也不是bfs的都能过
查看原帖
随便打的不是spfa也不是bfs的都能过
463250
Testlya楼主2021/6/1 23:06

这题能有绿?

#include<bits/stdc++.h>
#define ri register int
#define maxn 51
#define maxm 1001
using namespace std;
typedef long long ll;
template<typename T> inline void read(T &x)
{
	x=0;register bool f=0;register char c=getchar();
	while(!isdigit(c)&&c!='-')c=getchar();
	if(c=='-')f=1,c=getchar();
	while(isdigit(c))x=(x<<3)+(x<<1)+c-'0',c=getchar();
	x=f?-x:x;
}
const int inf=2e9;
int n,m,k,tot,h[maxn],dis[maxn];
struct node{int pos,spc,dis;};
queue<node>q;
struct edge
{
	int next,v,w;
}e[maxm<<2];
inline void add(int x,int y,int z)
{
	e[++tot].next=h[x];
	h[x]=tot;
	e[tot].v=y;
	e[tot].w=z;
}
inline void spfa()
{
	for(ri i=1;i<=n;i++)dis[i]=inf;
	dis[1]=0;
	q.push((node){1,k,0});
	while(!q.empty())
	{
		node u=q.front();
		q.pop();
		ri x0=u.pos,c0=u.spc,d0=u.dis;
		if(d0<dis[x0])dis[x0]=d0;
		for(ri i=h[x0];i;i=e[i].next)
		{
			ri x1=e[i].v,d1=e[i].w;
			if(d0+d1/2<dis[x1]&&c0>0)q.push((node){x1,c0-1,d0+d1/2});
			if(d0+d1<dis[x1])q.push((node){x1,c0,d0+d1});
		}
	}
}
int main()
{
	read(n);
	read(m);
	read(k);
	ri x0,y0,z0;
	for(ri i=1;i<=m;i++)
	{
		read(x0);
		read(y0);
		read(z0);
		add(x0,y0,z0);
		add(y0,x0,z0);
	}
	spfa();
	printf("%d",dis[n]);
	return 0;
}

超级朴素的 SPFA,连 vis 剪枝都没有,就靠几个我自己都不太明白的 if 都能过。SPFA 题数据过水,再一次证明了这种算法已死

2021/6/1 23:06
加载中...