求助dalao,#5 WA
查看原帖
求助dalao,#5 WA
475419
AsoltA楼主2023/5/8 15:31

RT.

#include <bits/stdc++.h>
int n,m,num,hhh,head[3100005],start,end,dis[3100005];
struct edge
{
	int nxt,to,qz,from;
} g[18000005];
void add_edge(int u,int v,int quzhi)
{
	//printf("edge -> %d %d %d\n",u,v,quzhi);
	g[++hhh].nxt=head[u];
	head[u]=hhh;
	g[hhh].to=v;
	g[hhh].qz=quzhi;	
	g[hhh].from=u;
}
int getid(int x,int y)
{
	return x*n+y;
}
std::bitset<3100005> vis;
std::queue<int> q;
void spfa(int a)
{
	memset(dis,0x3f,sizeof(dis));
	dis[a]=0;
	q.push(a);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=g[i].nxt)
		{
			int v=g[i].to;
			if(dis[v]>dis[u]+g[i].qz)
			{
				dis[v]=dis[u]+g[i].qz;
				if(!vis[v])
				{
					vis[v]=true;
					q.push(v);
				}
			}
		}
	}
}
signed main()
{
	scanf("%d%d",&n,&m);
	num=sqrt(n/3);
	for(int i=1;i<=num;i++)
	{
		for(int j=0;j<n;j++)
		{
			int x=getid(i,j);
			add_edge(x,j,0);
			if(i+j<n)
			{
				int y=getid(i,i+j);
				add_edge(x,y,1);
				add_edge(y,x,1);
			}
			else
			{
				break;
			}
		}
	}
	for(int j=0;j<m;j++)
	{
		int b,p;
		scanf("%d%d",&b,&p);
		if(j==0)
		{
			start=b;
		}
		if(j==1)
		{
			end=b;
		}
		if(p<=num)
		{
			add_edge(b,getid(p,b),0);
		}
		else
		{
			for(int i=1;b+i*p<n;i++)
			{
				add_edge(b,b+i*p,i);
			}
			for(int i=1;b-i*p>=0;i++)
			{
				add_edge(b,b-i*p,i);
			}
		}
	}
	if(start==end)
	{
		printf("0");
		return 0;
	}
	for(int i=1;i<=num;i++)
	{
		for(int j=0;j<n;j++)
		{
			int x=getid(i,j);
			if(head[x])
			{
				add_edge(x,j,0);
			}
		}
	}
	spfa(start);
	if(dis[end]>=0x3f3f3f3f)
	{
		printf("-1");
	}
	else
	{
		printf("%d",dis[end]);
	}
	return 0;
} 
2023/5/8 15:31
加载中...